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.

159
demandé sur George Stocker 2008-09-02 18:12:02

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.

252
répondu Jim Buck 2018-02-16 08:17:15

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 /?

76
répondu Mark Ingram 2017-12-21 04:32:03

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...

5
répondu Nathan Fritz 2008-09-03 01:51:51

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.

3
répondu 2008-09-02 14:23:40

Expansion sur Nathans post. Ce qui suit fera le lot de travail dans un fichier batch.

@echo off

if %1.==Sub. goto %2

for %%f in (*.in) do call %0 Sub action %%~nf
goto end

:action
echo The file is %3
copy %3.in %3.out
ren %3.out monkeys_are_cool.txt

:end
3
répondu Martin 2017-05-23 12:18:01

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
0
répondu Sandro Rosa 2016-02-23 08:57:50

É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.

0
répondu Z. Mickaels 2017-10-16 02:16:36