Iterar todos os arquivos em um diretório usando um laço 'for'
-
02-07-2019 - |
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?
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"
Gostaria de usar vbscript (Windows Scripting Host), porque no lote Eu tenho certeza que você não pode dizer que um nome é um arquivo ou um diretório.
Em VBS, pode ser algo como isto:
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 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 ??p>
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
)