Comment puis-je parcourir chaque fichier d'un répertoire à l'aide d'une boucle for
?
Et comment pourrais-je savoir si une certaine entrée est un répertoire ou s'il ne s'agit que d'un fichier?
Ceci liste tous les fichiers (et seulement les fichiers) dans le répertoire actuel:
for /r %i in (*) do echo %i
De plus, si vous exécutez cette commande dans un fichier de commandes, vous devez doubler les signes%.
for /r %%i in (*) do echo %%i
(merci @agnul)
Itérer à travers ...
for %f in (.\*) do @echo %f
for /D %s in (.\*) do @echo %s
for /R %f in (.\*) do @echo %f
for /R /D %s in (.\*) do @echo %s
Malheureusement, je n'ai trouvé aucun moyen de parcourir les fichiers et les sous-répertoires en même temps.
Utilisez simplement cygwin avec son bash pour beaucoup plus de fonctionnalités.
À part cela: avez-vous remarqué que l'aide à la construction de MS Windows est une excellente ressource pour la description 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 exécuter FOR
à partir de la ligne de commande et à partir d'un fichier de commandes. Dans un fichier de commandes, vous devez insérer deux caractères %
devant chaque référence de variable.
A partir d'une ligne de commande:
FOR %i IN (*) DO ECHO %i
A partir d'un fichier batch:
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 les noms de fichiers longs avec des espaces ....
'/ b "affiche uniquement les noms, pas les dates de taille, etc.
Quelques choses à savoir sur dir/un argument.
Si vous utilisez ceci sur la ligne de commande, supprimez un "%".
J'espère que cela t'aides.
En bash, vous pourriez faire quelque chose comme ça:
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 demandé à propos de batch , ce que j'ai mal interprété comme bash . Cette réponse peut donc ne pas être appropriée à votre question.
% 1 fait référence au premier argument passé et ne peut pas être utilisé dans un itérateur.
Essaye ça:
@echo off
for %%i in (*.*) do echo %%i
for %1 in (*.*) do echo %1
Essayez "HELP FOR" dans cmd pour un guide complet
Ceci est le guide pour les commandes XP. http://www.ss64.com/nt/
Le code suivant crée un fichier nommé"AllFilesInCurrentDirectorylist.txt"dans le répertoire actuel, qui contient la liste de tous les fichiers (uniquement les fichiers) du répertoire actuel. Vérifiez-le
dir /b /a-d > AllFilesInCurrentDirectorylist.txt
J'utiliserais vbscript (Windows Scripting Host), car je suis sûr que, par lots, vous ne pouvez pas dire qu'un nom est un fichier ou un répertoire.
Dans vbs, ça peut être quelque chose comme ça:
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 de fichier. Donc, si vous voulez obtenir soit un répertoire, soit tous les fichiers du sous-répertoire, vous pouvez faire quelque chose comme ceci:
for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a
Je viens d'utiliser le c:\comme destination, car il existe toujours sur les systèmes Windows et ne copie pas, donc cela n'a pas d'importance. si vous voulez aussi les sous-répertoires, utilisez simplement l'option/s à la fin. Vous pouvez également utiliser les autres commutateurs de xcopy si vous en avez besoin pour d'autres raisons.
J'ai eu du mal à obtenir la réponse de jop pour travailler avec un chemin absolu avant d'avoir trouvé cette référence: https://ss64.com/nt/for_r.html
L'exemple suivant parcourt tous les fichiers d'un répertoire donné par le chemin absolu.
For /R C:\absoulte\path\ %%G IN (*.*) do (
Echo %%G
)
essaye ça:
::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
il compte les fichiers .msi et .exe dans votre répertoire (et dans le sous-répertoire). Cela fait donc aussi la différence entre les dossiers et les fichiers en tant qu'exécutables.
Ajoutez simplement une extension (.pptx .docx ..) si vous avez besoin de filtrer d'autres fichiers de la boucle.
Il pourrait aussi utiliser le forfiles command:
forfiles /s
et aussi vérifier si c'est un répertoire
forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
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 vous indiquera seulement si un fichier n'est PAS un répertoire, ce qui sera également vrai si le fichier n'existe pas, alors assurez-vous de vérifier d'abord si cela est nécessaire. Les carets (^) sont utilisés pour échapper aux symboles de redirection et la sortie de liste de fichiers est redirigée vers NUL pour empêcher son affichage, 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. ".
Dans mon cas, je devais supprimer tous les fichiers et dossiers sous un dossier temporaire. C'est comme ça que j'ai fini par le faire. Je devais 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"
)
Pour parcourir tous les fichiers et dossiers vous pouvez utiliser
for /F "delims=" %%a in ('dir /b /s') do echo %%a
Pour parcourir tous les dossiers uniquement pas avec des fichiers, vous pouvez alors utiliser
for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a
Où /s
donnera tous les résultats dans l’arborescence de répertoires avec une profondeur illimitée. Vous pouvez ignorer /s
si vous souhaitez parcourir le contenu de ce dossier et non leur sous-dossier.
Pour parcourir un fichier nommé particulier et des dossiers vous pouvez rechercher le nom et effectuer une itération à l'aide de la boucle for
for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a
Pour parcourir des dossiers/répertoires nommés particuliers et non des fichiers , utilisez ensuite /AD
dans la même commande
for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a