Comment faire une boucle à travers les fichiers correspondant à un caractère générique dans un fichier batch
J'ai un ensemble de noms de fichiers de base, pour chaque nom 'f' il y a exactement deux fichiers, 'f.in" et "F. out". Je veux écrire un fichier batch (dans Windows XP) qui passe par tous les noms de fichiers, pour chacun il devrait:
- Affiche le nom de base ' f '
- Effectuer une action sur 'f.in"
- Effectuer une autre action sur 'F. out'
Je n'ai aucun moyen de lister l'ensemble des noms de fichiers de base, autre que de rechercher*. in (ou*.out) par exemple.
7 réponses
En Supposant que vous avez deux programmes qui traitent les deux fichiers, process_in.exe et process_out.exe:
for %%f in (*.in) do (
echo %%~nf
process_in "%%~nf.in"
process_out "%%~nf.out"
)
%%~nf est un modificateur de substitution, qui étend %f à un nom de fichier uniquement. Voir les autres modificateurs dans https://technet.microsoft.com/en-us/library/bb490909.aspx (à mi-chemin de la page) ou juste dans la réponse suivante.
Vous pouvez utiliser cette ligne pour imprimer le contenu de votre bureau:
FOR %%I in (C:\windows\desktop\*.*) DO echo %%I
Une fois que vous avez la variable %%I
, Il est facile d'effectuer une commande dessus (il suffit de remplacer le mot echo par votre programme)
En outre, la substitution des références de variables a été améliorée Vous pouvez maintenant utiliser la syntaxe facultative suivante:
%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only (directory with \)
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file
%~$PATH:I - searches the directories listed in the PATH
environment variable and expands %I to the
fully qualified name of the first one found.
If the environment variable name is not
defined or the file is not found by the
search, then this modifier expands to the
empty string
[https://ss64.com/nt/syntax-args.html][1]
Dans les exemples ci-dessus, %I
et PATH peuvent être remplacés par d'autres
valeur. La syntaxe %~
se termine par un nom de variable valide pour.
Cueillette les noms de variables majuscules comme %I
le rendent plus lisible et
évite la confusion avec les modificateurs, qui ne sont pas sensibles à la casse.
, Vous pouvez obtenir la documentation complète en tapant FOR /?
Le plus simple, comme je le vois, est d'utiliser une boucle for qui appelle un deuxième fichier batch pour le traitement, en passant ce deuxième fichier le nom de base.
Selon le for /? aide, basename peut être extrait en utilisant l'option nifty ~N. Donc, le script de base se lirait:
for %%f in (*.in) do call process.cmd %%~nf
Ensuite, en cours.cmd, supposons que %0 contient le nom de base et agissez en conséquence. Par exemple:
echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt
Il pourrait y avoir une meilleure façon de le faire dans un script, mais j'ai toujours été un peu flou sur la façon de tirer de plusieurs commandes dans une seule boucle for Dans un fichier batch.
EDIT: c'est fantastique! J'avais en quelque sorte manqué la page dans les documents qui montraient que vous pouviez faire des blocs multi-lignes dans une boucle FOR. Je vais devoir revenir en arrière et réécrire des fichiers batch maintenant...
Il existe un outil habituellement utilisé dans les serveurs MS (pour autant que je me souvienne) appelé forfiles :
Le lien ci-dessus contient une aide ainsi qu'un lien vers la page de téléchargement microsoft.
Le code ci-dessous filtre les noms de fichiers commençant par une sous-chaîne donnée. Il pourrait être modifié pour répondre à différents besoins en travaillant sur l'extraction de sous-chaîne subfname et L'instruction IF:
echo off
rem filter all files not starting with the prefix 'dat'
setlocal enabledelayedexpansion
FOR /R your-folder-fullpath %%F IN (*.*) DO (
set fname=%%~nF
set subfname=!fname:~0,3!
IF NOT "!subfname!" == "dat" echo "%%F"
)
pause
Écho f.in et F. out séparera le concept de quoi boucler et de quoi ne pas boucler lorsqu'il est utilisé dans une boucle for /F.
::Get the files seperated
echo f.in>files_to_pass_through.txt
echo f.out>>files_to_pass_through.txt
for /F %%a in (files_to_pass_through.txt) do (
for /R %%b in (*.*) do (
if "%%a" NEQ "%%b" (
echo %%b>>dont_pass_through_these.txt
)
)
)
::I'm assuming the base name is the whole string "f".
::If I'm right then all the files begin with "f".
::So all you have to do is display "f". right?
::But that would be too easy.
::Let's do this the right way.
for /f %%C in (dont_pass_through_these.txt)
::displays the filename and not the extention
echo %~nC
)
Bien que vous n'ayez pas demandé, un bon moyen de passer des commandes dans f.in et F. out serait à...
for /F %%D "tokens=*" in (dont_pass_through_these.txt) do (
for /F %%E in (%%D) do (
start /wait %%E
)
)
Un lien vers toutes les commandes Windows XP: link
Je m'excuse si je n'ai pas répondu correctement. La question était très difficile à lire pour moi.