2010-02-24 10 views
0

fichier test.cmd:Affichage des lignes de fichier texte dans un fichier batch

name=dummy 

for /f "eol=; tokens=1 delims=," %%i in (list.txt) do ( 
echo i: %%i 
set name=%%i 
echo name: %name%) 

le fichier list.txt contient ces lignes (un nom par ligne):

John 
Tom 
Erica 
Sara 

Chaque temps que je lance ce lot, je reçois cette sortie:

i: John 
name: dummy 
i:T om 
name: dummy 
i: Erica 
name: dummy 
i: Sara 
name: dummy 

Il semble que la vari nom ne peut pas être affecté la valeur de %%i

Une idée?

Répondre

1

Vous tombez dans l'ancien piège de ne pas utiliser l'expansion retardée.

Pour une solution rapide, il suffit de mettre

setlocal enabledelayedexpansion 

avant cette boucle dans votre fichier batch et utiliser !name! au lieu de %name%.

CMD développe des variables lors de l'analyse d'une commande. Une commande dans ce sens est une ligne unique ou un "bloc", délimité par des parenthèses. La boucle complète for est seulement analysée une fois et à ce stade %name% est remplacée par la valeur qu'elle a à ce moment-là, à savoir "dummy". D'autre part, l'expansion retardée utilise ! au lieu de % pour délimiter les noms de variables et les variables sont alors développées juste avant l'exécution d'une commande.

Chaque fois que vous définissez une variable dans un bloc entre parenthèses et utilisez à nouveau sa valeur dans le même bloc, vous devez utiliser l'expansion retardée. help set a également quelques informations à ce sujet:

environnement Delayed expansion des variables est utile pour contourner les limites de l'expansion actuelle qui se produit quand une ligne de texte est lecture, pas quand il est exécuté. Le 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 les %VAR% dans les deuxIF déclarations est substitué lorsque la première IF déclaration est lu, puisque Logiquement, le inclut le corps du IF, qui est une instruction composée. Donc le IF à l'intérieur de l'instruction composée est en comparant réellement "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'il pas construire une liste des fichiers dans le répertoire courant, mais à la place sera juste la variable LIST à le dernier fichier trouvé. Encore une fois, cela est parce que le %LIST% est juste une fois étendu lorsque l'instruction FOR est lu, et à ce moment- la variable LIST est vide. Ainsi, la boucle réelle FOR nous exécutons est:

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

qui ne cesse mise LIST au dernier fichier trouvé.

environnement Delayed expansion des variables vous permet d'utiliser un caractère différent (le point d'exclamation) à développer des variables d'environnement à temps d'exécution. Si la variable retardée d'expansion est activée, les exemples ci-dessus pourraient être écrits comme suit au travail comme prévu:

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

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

Merci beaucoup! Vous avez définitivement sauvé ma journée. fabio vitale –

Questions connexes