2009-05-18 14 views
14

Pourquoi la sortie du fichier batch Windows suivante Foo est-elle suivie par Bar, au lieu de Baz?Le fichier batch ne parvient pas à définir la variable d'environnement dans l'instruction conditionnelle

@echo off 
setlocal 

set _=Foo 
echo %_% 
set _=Bar 
if 1==1 (
    set _=Baz 
    echo %_% 
) 

La sortie sur mon système (Microsoft Windows XP [version 5.1.2600]) est:

Foo 
Bar 

Si je supprime l'instruction conditionnelle, la sortie prévue de Foo et Baz est observée.

+0

Duplicata de http://stackoverflow.com/questions/305605/weird-scope-issue-in-bat-file –

Répondre

28

Ce qui se passe, c'est que la substitution de variable est faite quand une ligne est lue. Qu'est-ce que vous ne pas prendre en compte est le fait que:

if 1==1 (
    set _=Baz 
    echo %_% 
) 

est une « ligne », en dépit de ce que vous pouvez penser. L'expansion de "%_%" est effectuée avant l'instruction set.

Ce dont vous avez besoin, c'est d'une expansion retardée. À peu près tous mes scripts de commande commence par "setlocal enableextensions enabledelayedexpansion" afin d'utiliser la pleine puissance de cmd.exe.

donc ma version du script serait:

@echo off 
setlocal enableextensions enabledelayedexpansion 

set _=Foo 
echo !_! 
set _=Bar 
if 1==1 (
    set _=Baz 
    echo !_! 
) 

endlocal 

Cela génère la "Foo", "Baz" correcte plutôt que "Foo", "Bar".

+2

Génial, merci pour l'explication détaillée. Je pense que je suis encore une fois confronté à cette limitation exacte, mais dans un environnement plus restreint ici: http://stackoverflow.com/questions/879023/honoring-exit-codes-from-batch-files-invoked-by- msbuild Malheureusement, je n'ai pas la possibilité d'activer les extensions de commandes si j'utilise la tâche MSBuild 'Exec' ... hmmm ... –

3

essayer cette

@echo off 
setlocal 

set _=Foo 
echo %_% 
set _=Bar 
if "1" NEQ "2" goto end 
set _=Baz 
echo %_% 
:end 
4

La réponse à cette question est la même que la réponse à: Weird scope issue in batch file. Voir là pour plus de détails. L'expansion des variables est essentiellement effectuée au moment de la lecture de la ligne, pas au moment de l'exécution.

Questions connexes