2008-10-20 5 views
0

Qu'est-ce que le segment de code DOS suivant sera affiché? Pourquoi? (c'est-à-dire pourquoi ne se comporte-t-il pas comme vous le pensez d'abord)?Comportement de variable variable inattendue dans le fichier .bat

ensemble VAR = avant

si "% VAR%" == "avant" (

ensemble VAR = après;

echo% VAR%

)

[Je connais la réponse à cette question, mais je me suis rendu compte que cela valait la peine de poster]

Répondre

2

En fait, vous penseriez que la sortie serait "après", étant donné que nous avons réinitialisé la variable env à l'intérieur de la boucle.

Mais la sortie sera réellement "avant". La raison en est que la substitution de variable est faite dans les fichiers .bat par l'interpréteur quand une commande est lue, plutôt que quand elle est exécutée. Ainsi, pour l'instruction composée, les variables du corps sont évaluées lorsque l'instruction if est rencontrée pour la première fois.

Vous pouvez faire cela en utilisant l'expansion de variable d'environnement retardée (besoin de l'activer). Si elle est activée, vous pouvez alors faire:

set VAR = avant

si "% VAR%" == "avant" (

ensemble VAR = après;

écho VAR!

)

Vous pouvez activer l'expansion variable d'environnement différé en utilisant l'option/v lors du démarrage cmd.exe. [Backstory - beaucoup d'entre nous utilisent encore des fichiers .bat hérités pour conduire des choses comme faire des procédures, etc. Évidemment, il existe de meilleurs outils de script, mais pas toujours une option pour les utiliser. Je me suis heurté à ce problème il y a quelque temps et j'ai récemment trouvé deux autres personnes qui s'étaient arraché les cheveux par-dessus la même chose. Il est donc utile de comprendre comment l'interpréteur fait la substitution de variable].

0

La substitution pour% VAR% a lieu avant l'exécution de la commande. Bien qu'il y ait plusieurs commandes réparties sur plusieurs lignes, leur groupement en parens (...) provoque la lecture de l'ensemble de l'élément par l'analyseur cmd.exe en une seule commande. Donc, ce qui est exécuté ressemble à:

set VAR=before 

if "before" == "before" (

set VAR=after; 

echo before 

) 

à l'interprète.

C'est l'une des nombreuses choses qui rendent le traitement de fichiers par lots plutôt pénible quand vous essayez de faire autre chose que de simples choses.