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.

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

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.


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

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.

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


-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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.