Je voudrais savoir comment parcourir chaque ligne d'un fichier texte à l'aide d'un fichier de commandes Windows et traiter successivement chaque ligne de texte.
windows
batch-file
M. Kraus
la source
la source
%%A
par%A
dans la commande ci-dessus. Sinon, vous obtiendrez%%A was unexpected at this time.
.for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
->A = myfile.txt
. Des idées pour contrer cela?À partir de la référence de la ligne de commande Windows:
Pour analyser un fichier, en ignorant les lignes commentées, tapez:
Cette commande analyse chaque ligne dans Myfile.txt, en ignorant les lignes qui commencent par un point-virgule et en passant les deuxième et troisième jetons de chaque ligne au corps 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 sont interprétés comme définissant une chaîne littérale à analyser.
À propos, vous pouvez trouver le fichier d'aide en ligne de commande sur la plupart des systèmes Windows à l'adresse suivante:
la source
usebackq
» :for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
Dans un fichier batch, vous DEVEZ utiliser à la
%%
place de%
: (Typehelp for
)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 de myfile.txt au "processus" "sous-programme".
Lorsque vous utilisez la commande for dans un programme batch, vous devez utiliser le double signe% pour les variables.
Les lignes suivantes transmettent ces variables de la commande for à la sous-routine du processus et vous permettent de traiter ces informations.
J'ai quelques utilisations assez avancées de cette configuration exacte que je serais prêt à partager si d'autres exemples sont nécessaires. Ajoutez votre EOL ou Delims au besoin bien sûr.
la source
Amélioration de la première réponse "FOR / F ..": Ce que je devais faire était d'appeler exécuter tous les scripts répertoriés dans MyList.txt, donc cela a fonctionné pour moi:
--OU, si vous souhaitez le faire sur plusieurs lignes:
Edit: l'exemple donné ci-dessus est pour l'exécution de la boucle FOR à partir de l'invite de commande; à partir d'un script batch, un% supplémentaire doit être ajouté, comme indiqué ci-dessous:
la source
@ La réponse de MrKraus est instructive. De plus, permettez-moi d'ajouter que si vous souhaitez charger un fichier situé dans le même répertoire que le fichier batch, préfixez le nom du fichier avec% ~ dp0. Voici un exemple:
NB: Si votre nom de fichier ou répertoire (par exemple monfichier.txt dans l'exemple ci-dessus) a un espace (par exemple 'mon fichier.txt' ou 'c: \ Program Files'), utilisez:
, avec le mot-clé type appelant le
type
programme, qui affiche le contenu d'un fichier texte. Si vous ne voulez pas subir la surcharge de l'appel de la commande type, vous devez remplacer le répertoire par le répertoire du fichier texte. Notez que le type est toujours requis pour les noms de fichiers avec des espaces.J'espère que ça aidera quelqu'un!
la source
**cd /d %~dp0**
avant la boucle for. Cela garantirait que vous faites référence à un fichier dans le répertoire où se trouve le fichier batch. Merci pour l'observationtype
horizontype
fonctionner le travail, j'ai dû citer mon nom de fichier car il se trouve dans un répertoire différent qui contient des espaces (Damn youProgram Files
). Je reçois une erreurThe system cannot find the file `type.
La réponse acceptée est bonne, mais présente deux limites.
Il supprime les lignes vides et les lignes commençant par
;
Pour lire des lignes de n'importe quel contenu, vous avez besoin de la technique de basculement d'extension retardée.
Findstr est utilisé pour préfixer chaque ligne avec le numéro de ligne et deux points, donc les lignes vides ne sont plus vides.
DelayedExpansion doit être désactivé, lors de l'accès au
%%a
paramètre, sinon les points d'exclamation!
et les signes d'insertion^
seront perdus, car ils ont des significations spéciales dans ce mode.Mais pour supprimer le numéro de ligne de la ligne, l'extension retardée doit être activée.
set "var=!var:*:=!"
supprime tout jusqu'au premier deux-points (en utilisantdelims=:
supprimerait également tous les deux-points au début d'une ligne, pas seulement celui de findstr).L'endlocal désactive à nouveau l'expansion retardée pour la ligne suivante.
La seule limitation est maintenant la limite de longueur de ligne de ~ 8191, mais il ne semble pas possible de surmonter cela.
la source
setlocal
en ligne de commande. Lorsque j'exécute du code sur CMD, j'obtiens! Var! au lieu de blancs. Comment réparer?Ou, vous pouvez exclure les options entre guillemets:
la source
Voici un fichier bat que j'ai écrit pour exécuter tous les scripts SQL dans un dossier:
la source
Si vous avez un Windows NT familiale (une avec
cmd.exe
comme shell), essayez la commande FOR / F .la source
La réponse acceptée en utilisant
cmd.exe
etne fonctionne que pour les fichiers "normaux". Il échoue lamentablement avec des fichiers énormes.
Pour les gros fichiers, vous devrez peut-être utiliser Powershell et quelque chose comme ceci:
ou si vous avez suffisamment de mémoire:
Cela a fonctionné pour moi avec un fichier de 250 Mo contenant plus de 2 millions de lignes, où la
for /F ...
commande s'est bloquée après quelques milliers de lignes.Pour connaître les différences entre
foreach
etForEach-Object
, voir Présentation de ForEach et ForEach-Object .(crédits: lire le fichier ligne par ligne dans PowerShell )
la source
Exemples modifiés ici pour répertorier nos applications Rails sur Heroku - merci!
Code complet ici .
la source
for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...
(notez l'ajout de^
's utilisé pour échapper au tuyau, de sorte qu'il soit transmis aufor
et non directement au processeur de commandes)Pour imprimer toutes les lignes du fichier texte à partir de la ligne de commande (avec une extension différée):
Fonctionne avec les grands espaces, les lignes vides, les lignes des espaces.
Testé sur Win 10 CMD
la source
]]]
des lignes, le deuxième échantillon supprime les lignes vides et les lignes commençant par l'espacedelims
si des lignes du fichier texte commencent par]
ex. remplacer par un caractère qui ne le fait pas, ou un caractère de contrôle comme le retour arrière ou la cloche; ils ne se trouvent normalement pas dans les fichiers texte. La raison endelims=]
est de supprimer les espaces réservés créés par la commande/n
offind
pour conserver les lignes vides.