Question

Comment puis-je parcourir chaque fichier d'un répertoire à l'aide d'une for boucle?

Et comment pourrais-je savoir si une certaine entrée est un répertoire ou s'il ne s'agit que d'un fichier?

Était-ce utile?

La solution

Ceci répertorie tous les fichiers (et uniquement les fichiers) du 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)

Autres conseils

Itérer par ...

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

Malheureusement, je n'ai trouvé aucun moyen de parcourir simultanément les fichiers et les sous-répertoires.

Il suffit d’utiliser cygwin pour davantage de fonctionnalités.

En dehors de 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?

Consultez également cette page: 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.

À partir d'une ligne de commande:

FOR %i IN (*) DO ECHO %i

À partir d'un fichier de commandes:

FOR %%i IN (*) DO ECHO %%i

Pour parcourir chaque fichier, une boucle for fonctionnera:

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

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

Cela pose quelques problèmes et je pensais que mon cas d'utilisation pourrait aider. Voici une boucle qui lit les informations de chaque fichier '.txt' dans un répertoire et vous permet de faire quelque chose avec ce fichier (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 < = %% f obtiendra uniquement la première ligne du fichier.

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.

Ce qu'il faut savoir sur l'argument dir /.

  • Toute utilisation de " / a " listerait tout, y compris les attributs cachés et système.
  • " / ad " afficherait uniquement les sous-répertoires, y compris ceux cachés et ceux du système.
  • " / a-d " L'argument élimine le contenu avec l'attribut 'D'Directory.
  • " / a-d-h-s " montrera tout, sauf les entrées avec 'D'irectory, attribut S''Immem' caché '.

Si vous l'utilisez en ligne de commande, supprimez un & ";% &";.

.

J'espère que cela vous aidera.

% 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 &"; en 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 ( Fichiers uniquement) dans le répertoire actuel. Check it out

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

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"

J'utiliserais vbscript (Windows Scripting Host), car je ne suis pas sûr de pouvoir dire par lots qu'un nom est un fichier ou un répertoire.

Dans vbs, cela peut ressembler à 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 de fichier. Donc, si vous voulez obtenir un répertoire ou 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

J'utilise simplement le c: \ comme destination car il existe toujours sur les systèmes Windows et qu'il ne copie pas, peu importe. 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.

Essayez ceci pour vérifier 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

Ceci vous indiquera seulement si un fichier n'est PAS un répertoire, ce qui sera également vrai si le fichier n'existe pas. Assurez-vous donc 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 la 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 non trouvé & ";

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

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

Dans mon cas, j'ai dû supprimer tous les fichiers et dossiers situés 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 noms de fichiers ou de dossiers ont des espaces, vous devez utiliser & Quot; "

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 les fichiers, vous pouvez utiliser

.
for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

/s donnera tous les résultats dans l’arborescence de répertoires avec une profondeur illimitée. Vous pouvez ignorer /AD si vous souhaitez parcourir le contenu de ce dossier et non leur sous-dossier

Implémentation de la recherche dans l'itération

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 un dossier / répertoire nommé et non pas un fichier , utilisez <=> dans la même commande

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a

J'ai eu du mal à faire en sorte que la réponse de jop fonctionne 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
)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top