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?
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)
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
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
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.
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
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.
%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
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/
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
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 .
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.
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".
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
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"
)