ti-enxame.com

Arquivo de lote do Windows loop através de diretórios para processar arquivos?

Ok, eu sou um programador PHP e, infelizmente, por razões que não vou anunciar por brevidade, eu preciso escrever/usar um arquivo em lote que processa algumas imagens para mim. 

Eu tenho uma pasta cheia de pastas aninhadas, dentro de cada uma dessas pastas aninhadas é mais uma pasta que contém um número de imagens TIF, o número de imagens variam em cada pasta. Eu também tenho um arquivo de lote, vamos chamá-lo ProcessImages.bat para o Windows que você pode "soltar" esses arquivos TIF (ou, obviamente, especificá-los em uma lista de linha de comando ao invocar o morcego); em que ele cria uma nova pasta com todas as minhas imagens processo baseado em um EXE que eu tenho.

O bom é que porque o arquivo bat usa o caminho das pastas que você "soltar" nele, eu posso selecionar todos os TIFs de uma pasta e soltá-lo para fazer o processamento ... mas como eu continuo fazendo isso manualmente para as 300 ou mais pastas de TIFs que eu tenho, eu acho que isso atrapalha meu sistema de modo inacreditável e se eu pudesse processar um de cada vez (sem fazer manualmente) seria maravilhoso.

Tudo o que disse ... alguém poderia me apontar na direção certa (para um arquivo bat do Windows AMATEUR) de uma forma que eu possa escrever um script de batida do Windows que eu possa chamar de dentro de um diretório e tê-lo atravessar TODOS os diretórios contidos dentro esse diretório ... e executar meu arquivo de lote de processamento em cada conjunto de imagens, uma de cada vez?

Desde já, obrigado!

Tyler

33
Tyler

Você pode escrever um algoritmo recursivo em Lote que lhe dê o controle exato do que você faz em cada subdiretório aninhado:

@echo off
call :treeProcess
goto :eof

:treeProcess
rem Do whatever you want here over the files of this subdir, for example:
for %%f in (*.tif) do echo %%f
for /D %%d in (*) do (
    cd %%d
    call :treeProcess
    cd ..
)
exit /b
83
Aacini

A solução da Aacini funciona, mas você pode fazer isso em uma linha:

for /R %%f in (*.tif) do echo "%%f"
54
Jack Allan

Eu sei que isso não é recursão (iteração através de subdiretórios enumerados?), Mas pode funcionar melhor para algumas aplicações:

for /F "delims=" %%i in ('dir /ad /on /b /s') do (
    pushd %%i
    dir | find /i "Directory of"
    popd
)

Substitua a terceira linha por qualquer comando que você possa precisar.

dir/ad - lista apenas diretórios

O legal é pushd não precisa de aspas se espaços no caminho.

2
Manicalic

Postando aqui como parece ser a pergunta mais popular sobre este caso.

Aqui está uma velha jóia que eu finalmente consegui encontrar de volta na internet: sweep.exe
Ele executa o comando fornecido no diretório atual e em todos os subdiretórios, simples assim.


Vamos supor que você tenha algum programa que processa todos os arquivos em um diretório (mas os casos de uso são muito mais amplos que isso):

:: For example, a file C:\Commands\processimages.cmd which contains:
FOR %%f IN (*.png) DO whatever

Então, você quer rodar este programa no diretório atual e em todos os subdiretórios:

:: Put sweep.exe in your PATH, you'll love it!
C:\ImagesDir> sweep C:\Commands\processimages.cmd

:: And if processimages.cmd is in your PATH too, the command becomes:
C:\ImagesDir> sweep processimages


Prós: Você não precisa alterar seu programa original para processar subdiretórios. Você tem a opção de processar os subdiretórios somente se desejar. E este comando é tão simples e agradável de usar.

Con: pode falhar com alguns comandos (contendo espaços, aspas, eu não sei). Veja este segmento por exemplo.

2
Gras Double

A solução de Jack funciona melhor para mim, mas eu preciso fazer isso para o caminho UNC da rede (compartilhamento cifs/smb), portanto, é necessária uma pequena modificação:

for /R "\\mysrv\imgshr\somedir" %%f in (*.tif) do echo "%%f"

A dica original para este método é aqui

0
Tomsim