Itérer tous les fichiers dans un répertoire en utilisant une boucle' for'

Comment puis-je parcourir chaque fichier dans un répertoire en utilisant une boucle for?

Et comment pourrais-je dire si une entrée est un répertoire ou si c'est juste un fichier?

269
demandé sur Peter Mortensen 2008-09-26 13:42:34

15 réponses

Cette liste tous les fichiers (et uniquement les fichiers) dans le répertoire courant:

for /r %i in (*) do echo %i

De plus, si vous exécutez cette commande dans un fichier batch, vous devez doubler les signes%.

for /r %%i in (*) do echo %%i

(merci @ agnul)

388
répondu jop 2008-09-29 16:48:19

Itérer à travers...

  • ...fichiers dans le répertoire courant: for %f in (.\*) do @echo %f
  • ...sous-répertoires dans le répertoire courant: for /D %s in (.\*) do @echo %s
  • ...fichiers en cours et tous les sous-répertoires: for /R %f in (.\*) do @echo %f
  • ...sous-répertoires en cours et tous les sous-répertoires: for /R /D %s in (.\*) do @echo %s

Malheureusement, je n'ai trouvé aucun moyen d'itérer sur les fichiers et les sous-répertoires en même temps.

Il suffit d'utiliser cygwin avec son bash pour beaucoup plus de fonctionnalités.

En dehors de cela: Avez-vous remarqué, que l'aide buildin DE MS Windows est - ce une excellente ressource pour les descriptions de la syntaxe de ligne de commande de cmd?

Regardez aussi ici: http://technet.microsoft.com/en-us/library/bb490890.aspx

184
répondu Marco 2014-11-05 13:45:02

Il existe une différence subtile entre l'exécution de FOR à partir de la ligne de commande et d'un fichier batch. Dans un fichier batch, vous DEVEZ PLACER DEUX % caractères devant chaque référence de variable.

Depuis une ligne de commande:

FOR %i IN (*) DO ECHO %i

À Partir d'un fichier de commandes:

FOR %%i IN (*) DO ECHO %%i
51
répondu aphoria 2012-09-28 12:10:31

Cette boucle for listera tous les fichiers d'un répertoire.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"delims=" est utile pour afficher des noms de fichiers longs avec des espaces....

'/b" afficher uniquement les noms, pas les dates de taille, etc..

Quelques choses à savoir sur l'argument dir /a.

  • Toute utilisation de "/ a " listerait tout, y compris les attributs cachés et système.
  • "/annonces" affichent uniquement les sous-répertoires, y compris les cachés et système chers.
  • l'argument" / a-d " élimine le contenu avec 'd'irectory attribut.
  • " / A-d-h-s " affichera tout, sauf les entrées avec l'attribut 'd'irectory, 'h'hidden' s'system.

Si vous l'utilisez sur la ligne de commande, supprimez un"%".

J'espère que cela aide.

39
répondu Jay 2009-07-08 11:49:38

Pour itérer sur chaque fichier d'une boucle for va travailler:

for %%f in (directory\path\*) do ( something_here )

Dans mon cas, je voulais aussi le contenu du fichier, nom, etc.

cela a conduit à quelques problèmes et j'ai pensé que mon cas d'utilisation pourrait aider. Voici une boucle qui lit les informations de chaque '.txt ' fichier dans un répertoire et vous permet de faire quelque chose avec (setx par exemple).

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

* Limitation: val

37
répondu Aaron Votre 2016-05-10 13:54:52

Dans bash, vous pourriez faire quelque chose comme ceci:

for fn in *; do
    if [ -d $fn ]; then
        echo "$fn is a directory"
    fi
    if [ -f $fn ]; then
        echo "$fn is a file"
    fi
done

Je viens de remarquer que vous avez posé des questions sur batch , que j'ai mal interprété comme bash. Cette réponse peut donc ne pas convenir à votre question.

12
répondu Greg Hewgill 2008-09-26 09:46:40

%1 fait référence au premier argument transmis et ne peut pas être utilisé dans un itérateur.

Essayez ceci:

@echo off
for %%i in (*.*) do echo %%i
10
répondu Sam Meldrum 2008-09-26 09:52:34
for %1 in (*.*) do echo %1

Essayez "HELP FOR" Dans cmd pour un guide complet

C'est le guide des commandes XP. http://www.ss64.com/nt/

5
répondu Axeman 2008-09-26 12:37:19

Le code suivant crée un fichier Nommé "AllFilesInCurrentDirectorylist.txt" dans le Répertoire courant, qui contient la liste de tous les fichiers (Seuls les Fichiers) dans le Répertoire courant. Check it out

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
3
répondu Ankur 2010-09-28 09:21:02

J'utiliserais vbscript (Windows Scripting Host), car dans batch je suis sûr que vous ne pouvez pas dire qu'un nom est un fichier ou un répertoire.

Dans vbs, cela peut être quelque chose comme ceci:

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

Vérifiez FileSystemObject sur MSDN .

2
répondu Biri 2008-09-26 09:56:26

J'utilise la commande xcopy avec l'option /L pour obtenir les noms des fichiers. Donc, si vous voulez obtenir un répertoire ou tous les fichiers dans le sous-répertoire que vous pourriez faire quelque chose comme ceci:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

J'utilise juste le C:\ comme destination car il existe toujours sur les systèmes windows et il ne copie pas donc cela n'a pas d'importance. si vous voulez aussi les sous-répertoires, utilisez l'option /s à la fin. Vous pouvez également utiliser les autres commutateurs de xcopy si vous en avez besoin pour d'autres raisons.

2
répondu Knoots 2012-12-29 19:45:50

Essayez ceci pour tester si un fichier est un répertoire:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

Cela ne vous permet de savoir si un fichier n'est PAS un répertoire, qui sera également vrai si le fichier n'existe pas, alors assurez-vous de vérifier d'abord si vous en avez besoin. Les carets ( ^ ) sont utilisés pour échapper les symboles de redirection et la sortie de liste de fichiers est redirigée vers NUL pour l'empêcher d'être affichée, tandis que la sortie d'erreur de la liste DIR est redirigée vers la sortie afin que vous puissiez tester le message de DIR "Fichier introuvable".

2
répondu sugerfunk 2016-10-23 11:00:55

Il peut également utiliser la commande forfiles :

forfiles /s 

Et vérifiez également s'il s'agit d'un répertoire

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
2
répondu Max 2016-10-23 11:01:33

Essayez ceci:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

Ça compte .msi et .exe fichiers dans votre répertoire (et dans le sous-répertoire). Donc, il fait également la différence entre les dossiers et les fichiers en tant qu'exécutables.

Il suffit d'ajouter une extension (.pptx .docx .. si vous avez besoin de filtrer d'autres fichiers dans la boucle

1
répondu Littlepony 2016-12-02 10:38:32

Dans mon cas, j'ai dû supprimer tous les fichiers et dossiers sous un dossier temp. Donc, c'est comment j'ai fini par le faire. J'ai dû exécuter deux boucles une pour le fichier et une pour les dossiers. Si les fichiers ou les dossiers ont des espaces dans leurs noms, Vous devez utiliser ""

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)
0
répondu Sam B 2018-09-26 17:54:47