web-dev-qa-db-fra.com

Script batch pour exécuter des commandes dans chaque sous-dossier

Je dois écrire un script pour travailler sous Windows. Une fois exécuté, il exécutera une commande dans certains sous-répertoires. Malheureusement, je n'ai jamais rien fait par lot et je ne sais pas par où commencer.

Avec l'exemple de structure de dossiers:

\root
   \one
   \two
   \three
   \four

Je souhaite que le script entre dans les dossiers spécifiés (par exemple, "un" et "quatre"), puis exécute une commande dans tous les répertoires enfants de ces dossiers.

Si vous pouviez fournir de l'aide, peut-être un tutoriel de base ou juste le nom des commandes dont j'aurai besoin, je vous en serais très reconnaissant.

10
Kacper

Vous pouvez indiquer au lot d’itérer des répertoires:

for /d %i in (C:\temp\*) do ( cd "%i" &  *enter your command here* ) 

Utiliser un signe de pourcentage lorsqu'il est exécuté directement sur la ligne de commande, deux lorsqu'il est exécuté à partir d'un lot

Dans un lot, cela ressemblerait à quelque chose comme ceci:

@echo off
set back=%cd%
for /d %%i in (C:\temp\*) do (
cd "%%i"
echo current directory:
cd
pause
)
cd %back%

Placez les commandes dont vous avez besoin dans les lignes comprises entre ( et ). Si vous remplacez C:\temp\ par %1, vous pouvez indiquer au lot de prendre la valeur du répertoire du premier paramètre lorsque vous l'appelez . vous appelez alors le lot pour chaque répertoire ou lisez-les dans une liste:

for /f %i in (paths.lst) do call yourbatch %i

Le paths.lst ressemblera à ceci:

C:\
D:\
Y:\
C:\foo

Tout cela est écrit à partir de la mémoire, vous devrez donc peut-être ajouter des guillemets; -) Notez que cela ne traitera que le premier niveau de répertoires, ce qui signifie qu'aucun dossier enfant du dossier enfant sélectionné.

21
Marged

Vous devriez jeter un oeil à this . La commande que vous recherchez est FOR /R. Ressemble à ceci:

FOR /R "C:\SomePath\" %%F IN (.) DO (
    some command
)
3
MichaelS

J'aime la réponse de Marged qui a été définie comme MEILLEURE réponse (je vote), mais cette réponse présente un gros inconvénient.

Lorsque la commande DOS entre (et) contient des erreurs, le message d'erreur renvoyé par DOS n'est pas très explicite.

Pour information, ce message est

) was unexpected at this time.

Pour éviter cette situation, je propose la solution suivante:

@echo off

pushd .
for /d %%i in (.\WorkingTime\*.txt) do call :$DoSomething "%%i"
popd

pause
exit /B

::**************************************************
:$DoSomething
::**************************************************

echo current directory: %1
cd %1
echo current directory: %cd%
cd ..

exit /B

La "méthode" $ d'appel à la boucle FOR pour chaque répertoire trouvé en passant par DIR-NAME a un paramètre. Attention: les doubles guillemets sont passés au paramètre% 1 dans la méthode $ DoSomething.

La commande exit/B est utilisée pour indiquer la fin de la méthode et non la fin du script.

Le résultat sur mon PC où j’ai 2 dossiers dans le dossier c:\Temp est

D:\@Atos\Prestations>call test.bat
current directory: ".\New folder"
current directory: D:\@Atos\Prestations\New folder
current directory: ".\WorkingTime"
current directory: D:\@Atos\Prestations\WorkingTime
Press any key to continue . . .

Attention: dans la réponse Margeds, l’utilisation de cd "%% i" est incorrecte lorsque le dossier est relatif (dossier avec. Ou ..).

Pourquoi, parce que le script va dans le premier dossier et quand il est dans le premier dossier, il demande à aller dans le deuxième dossier DU premier dossier!

0
schlebe

Si vous avez un fichier * .cmd ou * .bat avec des commandes différentes dans chaque dossier (qui doit être exécuté à partir de ce sous-dossier), vous pouvez créer le fichier cmd dans le dossier racine avec le contenu suivant:

For /R .\ %%a IN (*script_to_execute.cmd) do (
cd "%%~da%%~pa"
%%a)

ou

For /R .\ %%a IN (*download.cmd) do (
echo "%%a"
echo "%%~da%%~pa"
cd "%%~da%%~pa"
%%a)

Je l'ai utilisé lorsque j'avais besoin de télécharger plusieurs listes de lecture de YouTube. Chaque dossier contenait un fichier cmd pour le téléchargement d'une liste de lecture spécifique. Comme le script de téléchargement télécharge la vidéo dans le dossier à partir duquel il a été appelé, je devais d'abord changer le répertoire de forking.

0
Yehor