Pergunta

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

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

Foi útil?

Solução

Esta 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 que você precisa dobrar os sinais%.

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

(graças @agnul)

Outras dicas

Iterate através ...

  • ... arquivos em dir atual: for %f in (.\*) do @echo %f
  • ... subdirs em dir atual: for /D %s in (.\*) do @echo %s
  • ... arquivos atual e todos os subdiretórios: for /R %f in (.\*) do @echo %f
  • ... subdirs em curso e todos os subdiretórios: for /R /D %s in (.\*) do @echo %s

Infelizmente eu não encontrar alguma maneira para iterar sobre os arquivos e subdiretórios ao mesmo tempo.

Apenas uso cygwin com a sua festa por muito mais funcionalidades.

Para além disto: Você notou que a ajuda buildin de MS Windows é um grande recurso para descrições de sintaxe de linha de comando do cmd

?

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

Há uma sutil diferença entre executar FOR a partir da linha de comando e de um arquivo de lote. Em um arquivo de lote, você precisa colocar dois personagens % na frente de cada variável de referência.

A partir de uma linha de comando:

FOR %i IN (*) DO ECHO %i

A partir de um arquivo de lote:

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

Para iterar sobre cada arquivo de um loop 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 algumas questões e eu pensei que o meu caso de uso pode ajudar. Aqui é um loop que lê informações de cada arquivo '.txt' em um diretório e permite que você faça fazer algo 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 só vai conseguir a primeira linha do arquivo

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

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

"delims =" é útil para mostrar nomes de arquivos longos com espaços ....

'/ b" mostrar apenas os nomes, não datas tamanho etc ..

Algumas coisas a saber sobre o dir / a discussão.

  • Qualquer uso de "/ a" iria listar tudo, incluindo atributos ocultos e de sistema.
  • "/ ad" só iria mostrar subdiretórios, incluindo os ocultos e de sistema.
  • "/ a-d" conteúdo elimina discussão com atributo irectory 'D'.
  • "/ a-d-h-s" vai mostrar tudo, mas as entradas com 'D'irectory,' H'idden 'S'ystem atributo.

Se você usar este na linha de comando, remover um "%".

Espero que isso ajude.

% 1 refere-se ao primeiro argumento passado em e não pode ser utilizado em uma iteração.

Tente isto:

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

Tente "Ajuda" no cmd para um guia completo

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

O código a seguir cria um arquivo chamado "AllFilesInCurrentDirectorylist.txt" na atual Diretório, que contém a lista de todos os arquivos (apenas os arquivos) na atual Diretório. Check it out

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

Ele também poderia usar o href="http://technet.microsoft.com/en-us/library/cc753551.aspx" rel="nofollow"> comando :

forfiles /s 

e também verificar se é um diretório

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

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

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

Eu só uso o c: \ como destino porque sempre existe em sistemas Windows e não é copiar, por isso não importa. se você quiser os subdiretórios também apenas usar a opção / s no final. Você também pode usar os outros switches de xcopy se você precisar deles por outras razões.

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ó vai dizer se um arquivo não é um diretório, que também será verdadeiro se o arquivo não existe, por isso não deixe de verificar para que primeiro se você precisa. Os sinais de intercalação (^) são usadas para escapar dos símbolos de redirecionamento e o arquivo de saída lista é redirecionado para NUL para impedir que ele seja exibido, enquanto o DIR do listando saída de erro é redirecionado para a saída para que você possa testar contra a mensagem de DIR "Arquivo não encontrado ".

tente o seguinte:

::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 .msi e .exe no seu diretório (e no directório sub). Por isso também faz a diferença entre pastas e arquivos como executáveis.

Basta adicionar uma extensão (.pptx .docx ..) se você precisa filtrar outros arquivos no circuito

No meu caso eu tive que apagar todos os arquivos e pastas sob uma pasta temporária. Então é assim que eu acabei fazendo isso. Eu tive que correr duas voltas outra para arquivo e uma para pastas. Se os arquivos ou pastas têm espaços em seus nomes, então você tem que usar " "

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)

Para percorrer todos os arquivos e pastas você pode usar

for /F "delims=" %%a in ('dir /b /s') do echo %%a

Para percorrer todos pastas somente não com arquivos, então você pode usar

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

Onde /s vai dar todos os resultados em toda a árvore de diretórios em profundidade ilimitada. Você pode pular /s se você quiser para percorrer o conteúdo dessa pasta não sua sub pasta

Implementação procurar na iteração

Para iterate através de um determinado arquivos e pastas com o nome você pode procurar o nome e repita usando loop

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

Para iterate através de um determinado nomeados pastas / diretórios e não arquivos , em seguida, usar /AD no mesmo comando

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a

Eu tive problemas para obter a resposta de jop ao trabalho com um caminho absoluto, até que encontrei esta referência: https: / /ss64.com/nt/for_r.html

O exemplo a seguir percorre todos os arquivos em um diretório dado pelo caminho absoluto.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top