Iterar todos os arquivos em um diretório usando um loop ‘for’

Como posso iterar sobre cada arquivo em um diretório usando um loop for ?

E como eu poderia dizer se uma determinada input é um diretório ou se é apenas um arquivo?

Isso lista todos os arquivos (e somente os arquivos) no diretório atual:

 for /r %i in (*) do echo %i 

Além disso, se você executar esse comando em um arquivo de lote, precisará duplicar os sinais%.

 for /r %%i in (*) do echo %%i 

(obrigado @agnul)

Iterar através de …

  • … arquivos no diretório atual: for %f in (.\*) do @echo %f
  • … subdiretórios no diretório atual: for /D %s in (.\*) do @echo %s
  • … arquivos no atual e todos os subdiretórios: for /R %f in (.\*) do @echo %f
  • … subdiretórios no atual e todos os subdiretórios: for /R /D %s in (.\*) do @echo %s

Infelizmente, não encontrei nenhuma maneira de iterar arquivos e subdiretórios ao mesmo tempo.

Basta usar o cygwin com seu bash para muito mais funcionalidade.

Além disso: Você percebeu que a ajuda do MS Windows é um ótimo recurso para descrições da syntax da linha de comando do cmd?

Também dê uma olhada aqui: http://technet.microsoft.com/en-us/library/bb490890.aspx

Há uma diferença sutil entre a execução de FOR da linha de comando e de um arquivo em lotes. Em um arquivo de lote, você precisa colocar dois caracteres % na frente de cada referência de variável.

De uma linha de comando:

 FOR %i IN (*) DO ECHO %i 

De um arquivo em lotes:

 FOR %%i IN (*) DO ECHO %%i 

Este for-loop listará todos os arquivos em um diretório.

 pushd somedir for /f "delims=" %%f in ('dir /b /adh-s') do echo %%f popd 

“delims =” é útil para mostrar nomes extensos de arquivos com espaços …

‘/ b “mostra apenas nomes, não datas de tamanho etc.

Algumas coisas para saber sobre o argumento dir / a.

  • Qualquer uso de “/ a” listaria tudo, incluindo os atributos ocultos e do sistema.
  • “/ ad” mostraria apenas subdiretórios, incluindo os ocultos e os do sistema.
  • O argumento “/ ad” elimina o conteúdo com o atributo “D’irectory”.
  • “/ adhs” mostrará tudo, mas inputs com o atributo ‘D’irectory,’ H’idden ‘S’ystem.

Se você usar isso na linha de comando, remova um “%”.

Espero que isto ajude.

Para iterar sobre cada arquivo, um loop for funcionará:

for %%f in (directory\path\*) do ( something_here )

No meu caso eu também queria o conteúdo do arquivo, nome, etc.

Isso levou a alguns problemas e achei que meu caso de uso poderia ajudar. Aqui está um loop que lê informações de cada arquivo ‘.txt’ em um diretório e permite que você faça alguma coisa com ele (setx, por exemplo).

 @ECHO OFF setlocal enabledelayedexpansion for %%f in (directory\path\*.txt) do ( set /p val=< %%f echo "fullname: %%f" echo "name: %%~nf" echo "contents: !val!" ) 

* Limitação: val < = %% f somente obterá a primeira linha do arquivo.

No bash, você pode fazer algo assim:

 for fn in *; do if [ -d $fn ]; then echo "$fn is a directory" fi if [ -f $fn ]; then echo "$fn is a file" fi done 

Eu só notei que você perguntou sobre o lote , que eu interpretei mal como bash . Essa resposta pode, portanto, não ser apropriada à sua pergunta.

% 1 refere-se ao primeiro argumento transmitido e não pode ser usado em um iterador.

Tente isto:

 @echo off for %%i in (*.*) do echo %%i 
 for %1 in (*.*) do echo %1 

Tente “AJUDA PARA” em cmd para um guia completo

Este é o guia para comandos do XP. http://www.ss64.com/nt/

O código a seguir cria um arquivo chamado “AllFilesInCurrentDirectorylist.txt” no diretório atual, que contém a lista de todos os arquivos (somente arquivos) no diretório atual. Confira

 dir /b /ad > AllFilesInCurrentDirectorylist.txt 

Eu usaria vbscript (Windows Scripting Host), porque em lote eu tenho certeza que você não pode dizer que um nome é um arquivo ou um diretório.

Em vbs, pode ser algo assim:

 Dim fileSystemObject Set fileSystemObject = CreateObject("Scripting.FileSystemObject") Dim mainFolder Set mainFolder = fileSystemObject.GetFolder(myFolder) Dim files Set files = mainFolder.Files For Each file in files ... Next Dim subFolders Set subFolders = mainFolder.SubFolders For Each folder in subFolders ... Next 

Verifique FileSystemObject no MSDN .

Eu uso o comando xcopy com a opção / L para obter os nomes dos arquivos. Então, se você quer obter um diretório ou todos os arquivos no subdiretório, você poderia fazer algo assim:

 for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a 

Eu só uso o c: \ como o destino, porque ele sempre existe em sistemas Windows e não está copiando, então não importa. Se você quiser os subdiretórios, use apenas a opção / s no final. Você também pode usar os outros switches do xcopy se precisar deles por outros motivos.

Tente isto para testar se um arquivo é um diretório:

 FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory 

Isso só dirá se um arquivo NÃO é um diretório, o que também será verdadeiro se o arquivo não existir, portanto, verifique primeiro se necessário. Os carets (^) são usados ​​para escaping dos símbolos de redirecionamento e a saída de listview de arquivos é redirecionada para NUL para evitar que seja exibida, enquanto a saída de erro da listview DIR é redirecionada para a saída para que você possa testar a mensagem “Arquivo não encontrado” “.

Também poderia usar o comando forfiles :

 forfiles /s 

e também verificar se é um diretório

 forfiles /pc:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory" 

tente isto:

 ::Example directory set SetupDir=C:\Users ::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1 echo there are %counter% files in your folder 

Ele conta arquivos .msi e .exe em seu diretório (e no subdiretório). Por isso, também faz a diferença entre pastas e arquivos como executáveis.

Basta adicionar uma extensão (.pptx .docx ..) se precisar filtrar outros arquivos no loop