2010-07-24 3 views
5

Je n'ai pas trouvé de détails sur l'utilisation du masque de fichier dans un fichier batch. Mon exigence,Fichier de traitement par lots: masque de fichier

forfiles -p "C:\what\ever" -s -m *.log -c "cmd /c somecommmand" 

au lieu de sélectionner tous les fichiers journaux (* .log), comment sélectionner tous les fichiers journaux qui a un suffixe entier à la fin. Par exemple, parmi les fichiers suivants,

test.log, test1.log, test2.log, test3.log.. 

je besoin d'un masque de fichier pour sélectionner tous sauftest.log

J'ai essayé test*.log, mais slects test.log aussi bien. Il est préférable de ne pas inclure la partie du nom de fichier (test). quelque chose comme, *<0-9d>.log.

merci.

Répondre

0

essayer test?.log

+0

Ne fonctionne pas - vous pouvez l'essayer dans un shell: 'echo> test.log; echo> test1.log; dir test? .log' va trouver 2 fichiers. – schnaader

1

Comme test?.log et même test??.logva trouver test.log, aussi, la seule chose pour obtenir ce que vous voulez serait un certain type de solution, par exemple:

if exist test.log ren test.log test.tmp 
REM Do your stuff here, you can now use test*.log 
if exist text.tmp ren test.tmp test.log 

Je don ne sais pas si ce comportement inattendu de? (ne signifiant pas exactement un caractère, mais au plus un caractère) est quelque chose de Windows spécifique ou était comme ça depuis DOS, mais cela peut être très ennuyeux.

+0

merci .. Je pourrais le faire fonctionner de cette façon, aussi vous avez confirmé qu'il n'y a pas de genre regex dans le script batch. – bsr

1

Vous pouvez essayer ce qui suit, que je pense personnellement est terrible, mais il peut être juste ce dont vous avez besoin:

FOR %i IN (1 2 3 4 5 6 7 8 9 10 11 12 13 ...) DO IF EXIST test%i.log (somecommand) 

Si le suffixe est vraiment un nombre entier dans une gamme potentiellement très grande, cela ne fonctionnera pas — à moins d'imbriquer plusieurs boucles FOR, où chacune prend en charge un seul chiffre, et vous modifiez le IF EXIST test%i.log à quelque chose comme IF EXIST test%a%b%c%d.log (pour quatre chiffres).

De même, il n'est pas nécessaire d'exécuter somecommand dans un shell séparé (CMD /C), à moins que ce soit bien sûr ce que vous devez faire.

+0

merci .. +1 pour l'idée. – bsr

+1

Qu'en est-il de 'for/l'? – Joey

+0

* @ Johannes Rössel: * Cela, Monsieur, serait en fait plus intelligent que ce que j'ai suggéré. ;-) (J'ai appris quelque chose de nouveau aujourd'hui ...) – stakx

1

Pour faire correspondre les noms de fichiers contre une expression régulière dans un fichier batch que vous pouvez utiliser les éléments suivants pour la boucle comme modèle:

for /F "delims=" %%I in ('"dir /B /S | findstr /E "\\test[0-9][0-9]*\.log""') do (
    echo %%I 
) 

Cette affiche simplement les chemins complets de tous les fichiers dans le répertoire courant et ses sous répertoires, dont le nom correspond à test1.log, test2.log, test3.log, ...

La commande dir génère une liste de l'arborescence du répertoire en cours. Chaque ligne contient un chemin complet. La liste est acheminée via la commande findstr, qui correspond aux chemins d'accès complets par rapport à l'expression régulière donnée. À chaque itération, la variable %%I contient le chemin complet d'un fichier correspondant à l'expression régulière.

+0

Je vais essayer ça .. merci .. – bsr

Questions connexes