Como posso iterar sobre cada arquivo em um diretório usando um for
loop?
E como eu poderia saber se uma determinada entrada é um diretório ou se é apenas um arquivo?
windows
batch-file
for-loop
cmd
Vhaerun
fonte
fonte
Respostas:
Isso lista todos os arquivos (e apenas os arquivos) no diretório atual:
Além disso, se você executar esse comando em um arquivo em lotes, precisará dobrar os sinais de%.
(obrigado @agnul)
fonte
for /r %i in (*) do ( echo %~nxi )
. Esse encadeamento também pode ser realmente útil: stackoverflow.com/questions/112055/… .Iterar através de ...
for %f in (.\*) do @echo %f
for /D %s in (.\*) do @echo %s
for /R %f in (.\*) do @echo %f
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ê notou que a ajuda do build do MS Windows é um ótimo recurso para descrições da sintaxe da linha de comando do cmd?
Também dê uma olhada aqui: http://technet.microsoft.com/en-us/library/bb490890.aspx
fonte
%file
e%subdir
só pode ser um caractere, ou seja%f
,%s
.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, o 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 algo com ele (setx por exemplo).
* Limitação: val <= %% f só obterá a primeira linha do arquivo.
fonte
Há uma diferença sutil entre executar a
FOR
partir da linha de comando e de um arquivo em lotes. Em um arquivo em lotes, você precisa colocar dois%
caracteres na frente de cada referência de variável.Em uma linha de comando:
De um arquivo em lotes:
fonte
Esse loop for listará todos os arquivos em um diretório.
"delims =" é útil para mostrar nomes de arquivos longos com espaços nele ....
'/ b "mostra apenas nomes, não datas de tamanho, etc.
Algumas coisas a saber sobre o argumento dir / a.
Se você usar isso na linha de comando, remova um "%".
Espero que isto ajude.
fonte
% 1 refere-se ao primeiro argumento transmitido e não pode ser usado em um iterador.
Tente o seguinte:
fonte
Tente "AJUDA" no cmd para obter um guia completo
Este é o guia para os comandos do XP. http://www.ss64.com/nt/
fonte
Para percorrer todos os arquivos e pastas que você pode usar
Para percorrer todas as pastas apenas não com arquivos, você pode usar
Onde
/s
fornecerá todos os resultados em toda a árvore de diretórios em profundidade ilimitada. Você pode pular/s
se desejar percorrer o conteúdo dessa pasta e não da subpastaImplementando a pesquisa na iteração
Para iterar através de arquivos e pastas nomeados específicos, você pode procurar o nome e iterar usando o loop for
Para percorrer pastas / diretórios nomeados específicos e não arquivos , use
/AD
o mesmo comandofonte
Eu tive problemas para obter a resposta do jop para trabalhar com um caminho absoluto até encontrar esta referência: https://ss64.com/nt/for_r.html
O exemplo a seguir percorre todos os arquivos em um diretório fornecido pelo caminho absoluto.
fonte
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
fonte
Também poderia usar o comando forfiles :
e também verifique se é um diretório
fonte
@isdir==true
precisa ser@isdir==TRUE
Eu usaria vbscript (Windows Scripting Host), porque no lote tenho certeza de que você não pode dizer que um nome é um arquivo ou um diretório.
Em vbs, pode ser algo como isto:
Verifique FileSystemObject no MSDN .
fonte
Eu uso o comando xcopy com a opção / L para obter os nomes dos arquivos. Portanto, se você deseja obter um diretório ou todos os arquivos no subdiretório, pode fazer algo assim:
Eu apenas uso o c: \ como destino, porque ele sempre existe nos sistemas Windows e não está copiando, portanto não importa. Se você quiser os subdiretórios, basta usar a opção / s no final. Você também pode usar as outras opções do xcopy se precisar delas por outros motivos.
fonte
Tente isso para testar se um arquivo é um diretório:
Isso informará apenas se um arquivo NÃO é um diretório, o que também será verdadeiro se o arquivo não existir, portanto, verifique se o arquivo é necessário primeiro. Os sinais de intercalação (^) são usados para escapar dos símbolos de redirecionamento e a saída da lista de arquivos é redirecionada para NUL para impedir que seja exibida, enquanto a saída de erro da listagem DIR é redirecionada para a saída para que você possa testar a mensagem da DIR "Arquivo não encontrado" "
fonte
tente isto:
conta os arquivos .msi e .exe no 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
fonte
No meu caso, tive que excluir todos os arquivos e pastas abaixo de uma pasta temporária. Então foi assim que acabei fazendo isso. Eu tive que executar dois loops, um para arquivo e outro para pastas. Se arquivos ou pastas tiverem espaços em seus nomes, você precisará usar ""
fonte
Aqui está o meu ir com comentários no código.
Estou apenas aprimorando as habilidades de vingança, para perdoar qualquer erro flagrante.
Tentei escrever uma solução tudo em um da melhor maneira possível, com uma pequena modificação onde o usuário exige.
Algumas notas importantes: Apenas altere a variável
recursive
paraFALSE
se você quiser apenas os arquivos e pastas dos diretórios raiz processados. Caso contrário, ele percorrerá todas as pastas e arquivos.C&C muito bem-vindo ...
fonte