2008-12-15 5 views
2

Après avoir lu un article existant sur stackoverflow et fait quelques lectures sur le net. Je pensais qu'il était temps de poster ma question avant de perdre trop de cheveux!Windows Batch File - requête ENABLEDELAYEDEXPANSION

J'ai le code suivant dans un fichier batch que je double clique pour exécuter, sous Windows XP SP3:

SETLOCAL ENABLEDELAYEDEXPANSION 

::Observe variable is not defined 
SET test 

::Define initial value 
SET test = "Two" 

::Observe initial value is set 
SET test 

::Verify if the contents of the variable matches our condition 
If "!test!" == "Two" GOTO TWO 

::First Place holder 
:ONE 

::Echo first response 
ECHO "One" 

::Second Place holder 
:TWO 

::Echo second response 
ECHO "Two" 

::Await user input 
PAUSE 

ENDLOCAL 

Fondamentalement, je suis en train d'établir si je peux naviguer dans mon script en utilisant conditionals. Il semble évident que je reçois quelques problèmes avec la portée variable et l'expansion variable retardée pourtant je suis un peu perdu sur ce que je fais mal.

Quelqu'un peut-il me diriger dans la bonne direction?

Répondre

5

Votre problème immédiat est que vous configurez la variable à la valeur < "Two"> que vous pouvez voir ici:

@echo off 

SETLOCAL ENABLEDELAYEDEXPANSION 

::Observe variable is not defined 
SET test 

::Define initial value 
SET test = "Two" 

::Observe initial value is set 
SET test 
echo %test% 
echo..%test %. 

::Verify if the contents of the variable matches our condition 
If "!test!" == "Two" GOTO TWO 

::First Place holder 
:ONE 

::Echo first response 
ECHO "One" 

::Second Place holder 
:TWO 

::Echo second response 
ECHO "Two" 

::Await user input 
PAUSE 

ENDLOCAL 

qui produit:

Environment variable test not defined 
test = "Two" 
. "Two". 
"One" 
"Two" 
Press any key to continue . . . 

La raison pour laquelle votre " set test "est la sortie de la variable est la même raison pour laquelle" set t "serait - s'il n'y a pas de variable du nom spécifique, il produit toutes les variables commençant par ce nom.

La commande set est aussi une petite bête finicky et n'aime pas les espaces entourant les caractères '='; il les incorpore (et les citations d'ailleurs) dans le nom de variable d'environnement et la valeur qui lui est assignée. Au lieu de cela, utilisez:

set test=Two 

De même, lorsque vous utilisez une extension retardée, cela n'a pas d'importance depuis% test% et! Test! étendrait la même chose. Il est utile dans des déclarations comme:

if "!test!" == "Two" (
    set test=TwoAndABit 
    echo !test! 
) 

L'écho INNER TwoAndABit de sortie alors que% test%, ce qui est étendu lorsque l'ensemble instruction if est rencontrée, causerait à la sortie deux.

Cependant, j'utilise toujours une expansion différée partout juste pour la cohérence.

+0

Merci pour la réponse bien articulée Pax! Tout a lu, a testé et a résolu ma fin :) –

+0

Il a parcouru un long chemin depuis le mauvais vieux MS-DOS command.com jours - ce n'est toujours pas ksh ou bash, mais c'est faisable. – paxdiablo

0

La commande SET prend tout après le signe égal à travers le dernier caractère non vide. Votre commande ...

SET test = "Two" 

... met le test variable à la valeur « Deux » avec un chef de file en blanc et les guillemets, pas seulement la chaîne Deux.

Donc lorsque vous testez ...

If "!test!" == "Two" GOTO TWO 

vous vraiment tester ...

If " "Two"" == "Two" GOTO TWO 
Questions connexes