web-dev-qa-db-fra.com

Fichier de commandes Windows en boucle via des répertoires pour traiter des fichiers?

D'accord, je suis un programmeur PHP et, malheureusement, pour des raisons que je n'annoncerai pas par souci de brièveté, je dois écrire/utiliser un fichier de traitement par lots qui traite certaines images pour moi. 

J'ai un dossier plein de dossiers imbriqués, dans chacun de ces dossiers imbriqués se trouve un dossier contenant un certain nombre d'images TIF, le nombre d'images variant dans chaque dossier. J'ai aussi un fichier de commandes, appelons-le ProcessImages.bat pour Windows sur lequel vous pouvez "déposer" ces fichiers TIF (ou bien spécifiez-les dans une liste de ligne de commande lors de l'appel de la batte); sur lequel il crée un nouveau dossier avec toutes mes images en fonction d'un EXE que j'ai.

La bonne chose est que, parce que le fichier bat utilise le chemin des dossiers que vous "déposez" dessus, je peux sélectionner tous les fichiers TIF d'un dossier et le déposer pour effectuer le traitement ... mais comme je continue à le faire manuellement pendant Sur les quelque 300 dossiers de fichiers TIF que je possède, je trouve que cela engorge mon système de manière tellement incroyable et si je ne pouvais traiter que ceux-ci un à la fois (sans le faire manuellement), ce serait merveilleux.

Cela dit ... est-ce que quelqu'un pourrait me diriger dans la bonne direction (pour un fichier chauve-souris Windows AMATEUR) de manière à ce que je puisse écrire un script chauve-souris Windows que je peux appeler à partir d'un répertoire et le faire parcourir à travers tous les répertoires qu'il contient? ce répertoire ... et exécuter mon fichier de traitement par lots sur chaque ensemble d'images, une à la fois?

Merci d'avance!

Tyler

33
Tyler

Vous pouvez écrire un algorithme récursif dans Batch qui vous permet de contrôler exactement ce que vous faites dans chaque sous-répertoire imbriqué:

@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

La solution d'Aacini fonctionne mais vous pouvez le faire en une seule ligne:

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

Je sais que ce n'est pas une récursion (itération à travers des sous-répertoires énumérés?), Mais cela peut fonctionner mieux pour certaines applications

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

Remplacez la 3ème ligne par la commande dont vous avez besoin.

dir/ad - liste seulement les répertoires

La chose intéressante est pushd n'a pas besoin de guillemets s'il y a des espaces dans le chemin.

2
Manicalic

Publier ici car cela semble être la question la plus populaire à propos de cette affaire.

Voici un vieux bijou que j'ai finalement réussi à retrouver sur Internet: sweep.exe
Il exécute la commande fournie dans le répertoire courant et tous les sous-répertoires, aussi simple que cela.


Supposons que certains programmes traitent tous les fichiers d’un répertoire (mais les cas d’utilisation sont beaucoup plus larges que cela):

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

Donc, vous voulez exécuter ce programme dans le répertoire courant et dans tous les sous-répertoires:

:: 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


Pros: Vous n'êtes pas obligé de modifier votre programme d'origine pour lui permettre de traiter les sous-répertoires. Vous avez le choix de traiter les sous-répertoires uniquement si vous le souhaitez. Et cette commande est si simple et agréable à utiliser.

Con: Peut échouer avec certaines commandes (contenant des espaces, des guillemets, je ne sais pas). Voir ce fil par exemple.

2
Gras Double

La solution de Jack fonctionne mieux pour moi, mais je dois le faire pour le chemin UNC du réseau (partage cifs/smb). Une légère modification est donc nécessaire:

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

Le conseil original pour cette méthode est ici

0
Tomsim