Como fazer algo para cada arquivo em um diretório com um script em lote

265

Como você itera sobre cada arquivo em um diretório com um arquivo .bat ou .cmd?

Para simplificar, forneça uma resposta que apenas ecoe o nome do arquivo ou o caminho do arquivo.

Brian R. Bondy
fonte

Respostas:

348

Uso da linha de comando:

for /f %f in ('dir /b c:\') do echo %f

Uso de arquivo em lote:

for /f %%f in ('dir /b c:\') do echo %%f

Atualização : se o diretório contiver arquivos com espaço nos nomes, você precisará alterar o delimitador que o for /fcomando está usando. por exemplo, você pode usar o caractere de pipe.

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

Atualização 2 : (rápida um ano e meio após a resposta original :-)) Se o próprio nome do diretório tiver um espaço no nome, você poderá usar a usebackqopção no for:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

E se você precisar usar o redirecionamento de saída ou a tubulação de comando, use o escape char ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
Franci Penov
fonte
3
Pelo menos para alguns comandos, a variável do arquivo deve estar entre aspas duplas.
Jirka
1
Por que o /fnecessário após o for? De acordo com os documentos da ajuda, o /fsinalizador é aberto e lê cada arquivo. Isso é necessário para ecoar ou renomear arquivos?
Snekse
17
O /fdepois FORrestringe a arquivos. Da mesma forma, /drestringe-se a diretórios (pastas) e /rinstrui-o a ser recursivo.
3
+1 Esta é uma resposta viva, continuamente atendida; Muito Obrigado.
Sabuncu
4
Só percebi que você tem que usar aspas para trás ... Em vez de 'dir /b "c:\program files"'que deveria ser`dir /b "c:\program files"`
endavid
101

Como alternativa, use:

forfiles /s /m *.png /c "cmd /c echo @path"

O comando forfiles está disponível no Windows Vista e superior.

Paul Houx
fonte
1
era difícil usar caminhos com espaços no shell do segundo cmd. No final, ajustei% PATH% env var para concluir o trabalho. Mas obrigada. útil
twobob
70

Método mais fácil:

Na linha de comando, use:

for %f in (*.*) do echo %f

Em um arquivo em lotes (dobre os sinais de porcentagem%):

for %%f in (*.*) do echo %%f

Em um arquivo em lotes com pasta especificada como 1º parâmetro:

for %%f in (%1\*.*) do echo %%f
Gordon Bell
fonte
8
não apenas mais fácil, mas também significativamente mais elegante em comparação com a avaliação da dir /Bsaída for.
syneticon-dj
5
Adicione a / r antes do% f para
recursar
35

Usar

for /r path %%var in (*.*) do some_command %%var

com:

  • caminho sendo o caminho inicial.
  • %% var sendo algum identificador.
  • *. * sendo uma máscara de arquivo OU o conteúdo de uma variável.
  • some_command é o comando a ser executado com o caminho e var concatenados como parâmetros.
mstrobl
fonte
2
Eu recebo o erro: %%var was unexpected at this time.Você pode dar um exemplo exato? Eu tentei um monte de variações defor /r . %%var in (*.*) do echo %%var
hippietrail
3
Por algum motivo estranho, o nome da variável é restrito a um caractere.
Ollb
2
Podemos usar smileys diferentes para resultados diferentes?
Silver Quettier 4/08/14
8

Outra maneira:

for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"
thistleknot
fonte
o que "~ nf" significa?
usar o seguinte comando
@JudgeDredd "%~nf"significa o nome do arquivo sem extensão, onde fé o nome da variável especificada em forparte. Documentos: docs.microsoft.com/pt-br/previous-versions/windows/it-pro/…
Alph.Dev
-1

Eu tinha algum malware que marcava todos os arquivos em um diretório como oculto / system / readonly. Se mais alguém se encontrar nessa situação, faça o cd no diretório e execute for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

Anon
fonte