289 votes

Comment boucler à travers chaque ligne dans un fichier texte en utilisant un fichier batch Windows ?

Je voudrais savoir comment parcourir chaque ligne dans un fichier texte en utilisant un fichier de commandes Windows et traiter chaque ligne de texte successivement.

368voto

Mr. Kraus Points 1780

J'avais besoin de traiter toute la ligne dans son ensemble. Voici ce que j'ai trouvé fonctionner.

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

Le mot-clé tokens avec un astérisque (*) va extraire tout le texte de la ligne entière. Si vous ne mettez pas l'astérisque, il n'extraiera que le premier mot de la ligne. Je suppose que cela a à voir avec les espaces.

Commande For sur TechNet


S'il y a des espaces dans le chemin de votre fichier, vous devez utiliser usebackq. Par exemple.

for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A

46 votes

Une petite précision : pour que cela fonctionne en ligne de commande de manière interactive, remplacez %%A par %A dans la commande ci-dessus. Sinon, vous obtiendrez %%A était inattendu à ce moment..

24 votes

FYI, si vous devez effectuer une commande sur plusieurs lignes, après "DO", vous pouvez mettre une parenthèse ouverte "(" et quelques lignes plus tard, la terminer avec une parenthèse fermée ")" -- et vous pouvez simplement mettre votre bloc de code à l'intérieur de celles-ci (indenté à votre convenance).

0 votes

Si vous avez des problèmes avec des fichiers dans le même dossier avec des fichiers batch imbriqués, ou des fichiers qui ont des espaces dans leurs noms, regardez ma solution ci-dessous.

62voto

Ash Points 31541

À partir de la référence de la ligne de commande Windows :

Pour analyser un fichier en ignorant les lignes commentées, tapez :

for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k

Cette commande analyse chaque ligne dans Myfile.txt, en ignorant les lignes qui commencent par un point-virgule et en passant le deuxième et troisième jeton de chaque ligne au corps de la boucle FOR (les jetons sont délimités par des virgules ou des espaces). Le corps de l'instruction FOR fait référence à %i pour obtenir le deuxième jeton, %j pour obtenir le troisième jeton, et %k pour obtenir tous les jetons restants.

Si les noms de fichiers que vous fournissez contiennent des espaces, utilisez des guillemets autour du texte (par exemple, "Nom de fichier"). Pour utiliser des guillemets, vous devez utiliser usebackq. Sinon, les guillemets seront interprétés comme définissant une chaîne littérale à analyser.

Par ailleurs, vous pouvez trouver le fichier d'aide de la ligne de commande sur la plupart des systèmes Windows à :

 "C:\WINDOWS\Help\ntcmds.chm"

9 votes

Pour clarifier le "pour utiliser des guillemets, vous devez utiliser usebackq": for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")

0 votes

Pourquoi avez-vous omis le premier jeton ?

38voto

user332474 Points 101

Dans un fichier par lot, vous DEVEZ utiliser %% au lieu de % : (Tapez help for)

for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set VAR1=%1
set VAR2=%2
set VAR3=%3
COMMANDES POUR TRAITER LES INFORMATIONS
goto :EOF

Ce que cela fait : Le "do call :process %%i %%j %%k" à la fin de la commande for transmet les informations acquises dans la commande for à partir de myfile.txt à la « sous-routine » "process".

Lorsque vous utilisez la commande for dans un programme par lot, vous devez utiliser des doubles signes % pour les variables.

Les lignes suivantes transmettent ces variables de la commande for à la « sous-routine » de traitement et vous permettent de traiter ces informations.

set VAR1=%1
 set VAR2=%2
 set VAR3=%3

J'ai des utilisations assez avancées de cette configuration exacte que je serais prêt à partager si d'autres exemples sont nécessaires. Ajoutez vos EOL ou Delims selon vos besoins bien sûr.

33voto

Yogesh Mahajan Points 101

Amélioration de la première réponse "FOR /F...": Ce que j'ai dû faire était d'appeler exécuter chaque script répertorié dans MyList.txt, donc ça a fonctionné pour moi:

for /F "tokens=*" %A in  (MyList.txt) do CALL %A ARG1

--OU, si vous préférez le faire sur plusieurs lignes:

for /F "tokens=*" %A in  (MuList.txt) do (
ECHO Traitement de %A....
CALL %A ARG1
)

Édition: L'exemple donné ci-dessus est pour exécuter la boucle FOR depuis l'invite de commande; depuis un script batch, un % supplémentaire doit être ajouté, comme indiqué ci-dessous:

---DÉBUT de MyScript.bat---
@echo off
for /F "tokens=*" %%A in  ( MyList.TXT) do  (
   ECHO Traitement de %%A.... 
   CALL %%A ARG1 
)
@echo on
;---FIN de MyScript.bat---

14voto

Paul Points 408

Ou vous pouvez exclure les options entre guillemets :

FOR /F %%i IN (monfichier.txt) DO ECHO %%i

1 votes

Deux symboles de pourcentage côte à côte %% sont traités comme un seul symbole de pourcentage dans une commande (pas dans un fichier batch).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X