Windows Batch SET innerhalb WENN nicht funktioniert

101

Wenn ich dieses Skript ausführe (aus einer .bat-Datei):

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

Ich bekomme immer:

ECHO is on.

Das heißt, die var2Variable wurde nicht wirklich gesetzt. Kann mir bitte jemand helfen zu verstehen warum?

Orad SA
quelle

Antworten:

182

var2 ist gesetzt, aber die Erweiterung in der Zeile echo %var2%erfolgt, bevor der Block ausgeführt wird.
Zu diesem Zeitpunkt var2ist leer.

Daher ist die Syntax verzögerte Erweiterung vorhanden, die !anstelle von verwendet wird %und zur Ausführungszeit ausgewertet wird, nicht zur Analysezeit.

Bitte beachten Sie, dass zur Verwendung !die zusätzliche Anweisung setlocal EnableDelayedExpansionerforderlich ist.

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)
jeb
quelle
10
Danke, du hast mir gerade große Schmerzen erspart.
Myna
Gleiche Regel an &und &&Operatoren. Dieser Code wird set x=some & set y=%x%thing & echo results %y%ausgegeben %x%thing.
Gwarah
13

Ich bin ein bisschen spät , um die Partei , sondern eine andere Art und Weise mit diesem Zustand umzugehen , ist Prozess außerhalb fortzusetzen if, wie dies

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

Oder / und gotoSyntax verwenden

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

Auf diese Weise erfolgt die Erweiterung "rechtzeitig" und Sie brauchen sie nicht setlocal EnableDelayedExpansion. Fazit: Wenn Sie das Design Ihres Skripts überdenken, können Sie es so machen

TS
quelle
Ich kann nicht auf eine Variable zugreifen, die ich in einer if-Anweisung erstellt habe. Ihr erstes Beispiel mit var2 funktioniert nicht.
AntonioCS
@AntonioCS interessant ... das ist genau das Skript, das ich gerade getestet habe echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. und es funktioniert. "Wenn Sie eine Variable in der Batch-Datei erstellen, auf die überall im Programm zugegriffen werden kann." . aticleworld.com/batch-file-variables-and-scope
TS