Umgebungsvariablen in Stapeldateien werden erweitert, wenn eine Zeile analysiert wird. Bei Blöcken, die durch (Ihre if defined
) Klammern begrenzt sind , zählt der gesamte Block als "Zeile" oder Befehl.
Dies bedeutet, dass alle Vorkommen von% FOO% durch ihre Werte ersetzt werden, bevor der Block ausgeführt wird. In deinem Fall mit nichts, da die Variable noch keinen Wert hat.
Um dies zu lösen, können Sie die verzögerte Erweiterung aktivieren :
setlocal enabledelayedexpansion
Eine verzögerte Erweiterung bewirkt, dass durch Ausrufezeichen ( !
) begrenzte Variablen bei der Ausführung ausgewertet werden, anstatt sie zu analysieren, wodurch das richtige Verhalten in Ihrem Fall sichergestellt wird:
if not defined BAR (
set FOO=1
echo Foo: !FOO!
)
help set
Details dazu auch:
Schließlich wurde die Unterstützung für die verzögerte Erweiterung von Umgebungsvariablen hinzugefügt. Diese Unterstützung ist standardmäßig immer deaktiviert, kann jedoch über die /V
Befehlszeilenoption aktiviert / deaktiviert werden CMD.EXE
. SehenCMD /?
Die verzögerte Erweiterung von Umgebungsvariablen ist hilfreich, um die Einschränkungen der aktuellen Erweiterung zu umgehen, die beim Lesen einer Textzeile und nicht beim Ausführen auftreten. Das folgende Beispiel zeigt das Problem mit der sofortigen Variablenerweiterung:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
würde die Nachricht niemals anzeigen, da die Anweisung %VAR%
in beiden IF
Anweisungen beim Lesen der ersten IF-Anweisung ersetzt wird, da sie logisch den Hauptteil der IF
Anweisung enthält , bei der es sich um eine zusammengesetzte Anweisung handelt. Das IF in der zusammengesetzten Anweisung vergleicht also wirklich "Vorher" mit "Nachher", was niemals gleich sein wird. In ähnlicher Weise funktioniert das folgende Beispiel nicht wie erwartet:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
dadurch wird keine Liste der Dateien im aktuellen Verzeichnis erstellt, sondern lediglich die LIST
Variable auf die zuletzt gefundene Datei gesetzt. Dies ist wiederum darauf zurückzuführen, dass das %LIST%
Attribut nur einmal erweitert wird, wenn die FOR
Anweisung gelesen wird. Zu diesem Zeitpunkt ist die LIST
Variable leer. Die eigentliche FOR-Schleife, die wir ausführen, lautet also:
for %i in (*) do set LIST= %i
das setzt nur LIST
auf die zuletzt gefundene Datei.
Mit der verzögerten Erweiterung von Umgebungsvariablen können Sie zur Ausführungszeit Umgebungsvariablen mit einem anderen Zeichen (dem Ausrufezeichen) erweitern. Wenn die verzögerte Variablenerweiterung aktiviert ist, können die obigen Beispiele wie folgt geschrieben werden, um wie beabsichtigt zu funktionieren:
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%
!
, verwenden Sie^^^!
(es zweimal zu entkommen). Andernfalls wird die "verzögerte Erweiterung" -Funktion es essen.