Comment faire quelque chose pour chaque fichier d'un répertoire avec un script batch

265

Comment itérer sur chaque fichier d'un répertoire avec un fichier .bat ou .cmd?

Pour plus de simplicité, veuillez fournir une réponse qui fait simplement écho au nom de fichier ou au chemin d'accès au fichier.

Brian R. Bondy
la source

Réponses:

348

Utilisation de la ligne de commande:

for /f %f in ('dir /b c:\') do echo %f

Utilisation du fichier batch:

for /f %%f in ('dir /b c:\') do echo %%f

Mise à jour : si le répertoire contient des fichiers avec de l'espace dans les noms, vous devez changer le délimiteur que la for /fcommande utilise. par exemple, vous pouvez utiliser le caractère de tuyau.

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

Mise à jour 2 : (rapide un an et demi après la réponse originale :-)) Si le nom du répertoire lui-même a un espace dans le nom, vous pouvez utiliser l' usebackqoption sur for:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

Et si vous devez utiliser la redirection de sortie ou la tuyauterie de commande, utilisez le caractère d'échappement char ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
Franci Penov
la source
3
Au moins pour certaines commandes, la variable de fichier doit être placée entre guillemets.
Jirka
1
Pourquoi est-ce /fnécessaire après le for? Selon les documents d'aide, l' /findicateur s'ouvre et lit chaque fichier. Est-ce nécessaire pour faire écho ou renommer des fichiers?
Snekse
17
L' /faprès le FORrestreint aux fichiers. De même, se /dlimite aux répertoires (dossiers) et lui /rdemande d'être récursif.
3
+1 Il s'agit d'une réponse vivante, suivie en permanence; Merci beaucoup.
Sabuncu
4
Je viens de réaliser que vous devez utiliser des guillemets ... Au lieu de 'dir /b "c:\program files"'cela devrait être`dir /b "c:\program files"`
endavid
101

Vous pouvez également utiliser:

forfiles /s /m *.png /c "cmd /c echo @path"

La commande forfiles est disponible dans Windows Vista et versions ultérieures.

Paul Houx
la source
1
il était difficile d'utiliser des chemins avec des espaces dans le deuxième shell cmd. Au final, j'ai ajusté% PATH% env var pour faire le travail. Mais merci. utile
twobob
70

Méthode la plus simple:

Depuis la ligne de commande, utilisez:

for %f in (*.*) do echo %f

À partir d'un fichier batch (doublez les signes% pourcent):

for %%f in (*.*) do echo %%f

A partir d'un fichier batch avec dossier spécifié comme 1er paramètre:

for %%f in (%1\*.*) do echo %%f
Gordon Bell
la source
8
non seulement plus simple, mais aussi beaucoup plus élégant par rapport à l'évaluation de la dir /Bsortie avec for.
syneticon-dj
5
Ajouter un / r avant le% f pour recurer les sous
PRMan
35

Utilisation

for /r path %%var in (*.*) do some_command %%var

avec:

  • chemin étant le chemin de départ.
  • %% var étant un identifiant.
  • *. * étant un masque de fichier OU le contenu d'une variable.
  • some_command étant la commande à exécuter avec le chemin et var concaténés en tant que paramètres.
mstrobl
la source
2
Je reçois l'erreur: %%var was unexpected at this time.pouvez-vous donner un exemple exact? J'ai essayé un tas de variations defor /r . %%var in (*.*) do echo %%var
hippietrail
3
Pour une raison étrange, le nom de la variable est limité à un caractère.
ollb
2
Pouvons-nous utiliser différents smileys pour des résultats différents?
Silver Quettier
-1

J'ai eu un malware qui a marqué tous les fichiers d'un répertoire comme caché / système / en lecture seule. Si quelqu'un d'autre se retrouve dans cette situation, cd dans le répertoire et exécutez for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

Anon
la source