Concatenar todos os nomes de arquivos dentro de uma pasta em uma variável dentro de um script Batch

4

Estou tentando criar uma lista de arquivos para passar para um programa como um argumento, mas estou tendo problemas com isso.

Meu resultado desejado deve ser: file1.jpg, file2.bmp, file3.docx

O bastão que estou tentando usar é este:

SETLOCAL EnableDelayedExpansion
cd /D %~dp0
set _filelist=
for /f "delims=|" %%f in ('dir /b %CD%') do (
  set "_filelist=%_filelist%,%%f"
)
echo %_filelist%
pause

Mas só gera o último arquivo na lista: ,lastfile.xyz

O que estou fazendo de errado?

    
por Vico 18.10.2017 / 03:45

1 resposta

4

Parece que você esqueceu de usar o ponto de exclamação (" ! ") com a variável que você definiu dentro do loop.

Para resolver, basta usar !_filelist! em vez de %_filelist% .

Exemplo

SETLOCAL EnableDelayedExpansion
cd /D %~dp0
set _filelist=
for /f "delims=|" %%f in ('dir /b %CD%') do (
  set "_filelist=!_filelist!,%%f"
)
echo %_filelist%
pause

Delayed Expansion will cause variables within a batch file to be expanded at execution time rather than at parse time, this option is turned on with the SETLOCAL EnableDelayedExpansion command. [1]


When delayed expansion is in effect, variables can be immediately read using !variable_name! you can also still read and use %variable_name% that will show the initial value (expanded at the beginning of the line). [1]

Mais recursos

Exemplo de bônus

SETLOCAL EnableDelayedExpansion
cd /D %~dp0
set _filelist=,
for /f "delims=|" %%f in ('dir /b %CD%') do (
  set "_filelist=!_filelist!,%%f"
)
set _filelist=%_filelist:,,=%
echo %_filelist%
pause

O método acima definirá a variável set _filelist=, inicial com um único valor de vírgula para que a primeira iteração seja ,, e, em seguida, o primeiro valor iterado, em vez da vírgula nula mais uma vírgula. padrão único para trabalhar com a análise.

Você pode usar a funcionalidade Substituir variável para analisar as aspas duplas ( ,, ) e substitua aqueles com um valor em branco. A iteração final e o valor da variável set serão então analisados de fora do loop com set _filelist=%_filelist:,,=% removendo o valor prefixado por vírgula dupla.

    
por 18.10.2017 / 04:33