2010-11-23 10 views
2

J'écris un script Batch pour compiler une liste de fichiers sous la forme d'une chaîne ("fichier1.txt file2.txt filr3.txt ..."). Je fais cela car je veux exécuter une application qui nécessite de passer dans une liste de fichiers à traiter.Batch listing question

Tous les fichiers se trouvent dans le même dossier.

Quand je lance le code suivant:

FOR /f "tokens=*" %%M IN ('dir * /b') DO (
    SET files=%files% %%M 
) 
ECHO END %files% 

L'écho à la fin ne donne que le dernier fichier traité et non la liste complète. Quel est le problème avec ma mise en œuvre?

Merci pour toute aide que vous pouvez donner

Répondre

4

Vous devez utiliser l'expansion retardée:

setlocal enabledelayedexpansion 
for /f "tokens=*" %%M in ('dir * /b') do (
    set files=!files! %%M 
) 
echo END %files% 

Vous pouvez voir une documentation de ce à help set:

environnement retardé l'expansion variable utile pour se déplacer les limitations de l'expansion actuelle qui se passe quand une ligne du texte est lu, pas quand il est exécuté. L'exemple suivant illustre le problème avec l'extension de variable immédiate:

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "%VAR%" == "after" @echo If you see this, it worked 
) 

ne serait jamais afficher le message, depuis le %VAR% dans DEUX instructions IF est substitué lorsque la première instruction IF est lu, car il logiquement comprend le corps du IF, qui est une déclaration composée. Donc le IF à l'intérieur de l'instruction composée compare vraiment "avant" avec "après" qui ne sera jamais égal. De même, l'exemple suivant ne fonctionne pas comme prévu:

set LIST= 
for %i in (*) do set LIST=%LIST% %i 
echo %LIST% 

en ce qu'elle sera pas construire une liste de fichiers dans le répertoire courant, mais sera simplement la variable LIST au dernier fichier a trouvé. Encore une fois, cela est dû au fait que le %LIST% est développé une seule fois lorsque l'instruction FOR est lue, et à ce moment la variable LIST est vide. Ainsi la boucle FOR réelle nous exécutons est:

for %i in (*) do set LIST= %i 

qui ne cesse mise LIST au dernier fichier trouvé.

De plus, vous ne devriez jamais utiliser for /f itérer sur dir sortie car cela peut casser de manière subtile. Vous avez besoin d'un traitement spécial pour les noms de fichiers avec des espaces et il casse avec les polices raster et Unicode. Fondamentalement, vous dites: « Hé, je suis en cours d'exécution d'une commande, tokenizer sa sortie convertie en courant OEM codepage et essayer de travailler avec qu'au lieu de simplement demander for itérer sur les fichiers »:

for %%M in (*) do ... 
+0

Merci. Cela corrige tout. – VerticalEvent