Comment parcourir les fichiers correspondant au caractère générique dans le fichier batch

StackOverflow https://stackoverflow.com/questions/39615

Question

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 (sous Windows XP) qui parcourt tous les noms de fichiers, pour chacun il devrait :

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

Était-ce utile?

La solution

En supposant que vous disposez de 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 en un nom de fichier uniquement.Voir d'autres modificateurs dans https://technet.microsoft.com/en-us/library/bb490909.aspx (au milieu de la page) ou juste dans la réponse suivante.

Autres conseils

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 le %%I variable, il est facile d'exécuter une commande dessus (remplacez simplement le mot echo par votre programme)

De plus, la substitution des références variables a été améliorée, vous pouvez désormais 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 le chemin peut être remplacé par d'autres valeurs valides.Le %~ La syntaxe se termine par un nom de variable FOR valide.Choisir des noms de variables en majuscules comme %I Le rend 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 moyen le plus simple, à mon avis, consiste à utiliser une boucle for qui appelle un deuxième fichier de commandes pour le traitement, en lui transmettant le nom de base.

D'après le pour /?aide, le nom de base peut être extrait à l'aide de l'option astucieuse ~n.Ainsi, le script de base se lirait :

for %%f in (*.in) do call process.cmd %%~nf

Ensuite, dans process.cmd, supposez 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 existe peut-être une meilleure façon de le faire dans un seul script, mais j'ai toujours été un peu flou sur la façon d'extraire plusieurs commandes dans une seule boucle for dans un fichier batch.

MODIFIER:C'est fantastique!J'avais en quelque sorte manqué la page de la documentation qui montrait que l'on pouvait créer des blocs multilignes dans une boucle FOR.Je vais devoir revenir en arrière et réécrire certains fichiers batch maintenant...

Il existe un outil habituellement utilisé dans les serveurs MS (pour autant que je me souvienne) appelé pour les fichiers:

Le lien ci-dessus contient de l'aide ainsi qu'un lien vers la page de téléchargement de Microsoft.

S'étendre sur Nathan poste.Ce qui suit fera le travail dans un seul 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

Le code ci-dessous filtre les noms de fichiers commençant par la 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

Faire écho à f.in et f.out séparera le concept de ce qu'il faut boucler et de ce qu'il ne faut 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 ne l'ayez pas demandé, un bon moyen de transmettre des commandes à f.in et f.out serait de...

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 :lien

Je m'excuse si je n'ai pas répondu correctement.La question était très difficile à lire pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top