2009-05-18 4 views
14

Warum gibt die folgende Windows-Batch-Datei Foo gefolgt von Bar statt Baz aus?Batch-Datei kann keine Umgebungsvariable innerhalb der bedingten Anweisung setzen

@echo off 
setlocal 

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

Die Ausgabe auf meinem System (Microsoft Windows XP [Version 5.1.2600]) ist:

Foo 
Bar 

Wenn ich die bedingte Anweisung, die erwartete Ausgabe von Foo entfernen und Baz beobachtet wird.

+0

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

Antwort

28

Was passiert ist, dass Variable Ersetzung durchgeführt wird, wenn eine Zeile gelesen wird. Was Sie Fehler zu berücksichtigen, ist die Tatsache, dass:

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

ein „Linie“ ist, trotz allem, was Sie vielleicht denken. Die Erweiterung von "%_%" erfolgt vor die set Anweisung.

Was Sie brauchen, ist verzögerte Expansion. Fast jedes einzelne meiner Befehlsskripts beginnt mit "setlocal enableextensions enabledelayedexpansion", um die volle Leistung von cmd.exe zu verwenden.

So ist meine Version des Skripts wäre:

@echo off 
setlocal enableextensions enabledelayedexpansion 

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

endlocal 

Dies erzeugt die richtige "Foo", "Baz" statt "Foo", "Bar".

+2

Super, danke für die detaillierte Erklärung. Ich glaube, ich stoße wieder genau auf diese Einschränkung, aber in einem eingeschränkteren Umfeld: http://stackoverflow.com/questions/879023/honoring-exit-codes-from-batch-files-invoiced-by- Msbuild Leider habe ich nicht die Möglichkeit, Befehlserweiterungen zu aktivieren, wenn ich die MSBuild 'Exec 'Aufgabe verwende ... hmmm ... –

3

versuchen diese

@echo off 
setlocal 

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

Die Antwort darauf ist die gleiche wie die Antwort an: Weird scope issue in batch file. Siehe dort für weitere Details. Grundsätzlich erfolgt die variable Erweiterung zur Lesezeit der Zeile, nicht zur Ausführungszeit.

Verwandte Themen