Windows-Batch-Variablen werden nicht festgelegt

Ich glaube, ich habe einen Fehler in Windows Batch Scripting bekommen.

Ich kann keine Variablen festlegen, die sich in einer erweiterten if-statement befinden.

Hier ist ein isolierter Teil meines Skripts:

@echo off set success=1 set Version=12345 set Target=Client set Type=456 set dir= set zip= if "%Version%"=="" set success=0 if "%Type%"=="" set success=0 if 1==1 set test=42 if %success%==1 ( set test2=57005 if "%Target%"=="Client" ( set dir=ModName v%Version% set zip=ModName v%Version% %Type%.zip echo Version: %Version% echo Type: %Type% echo. echo Target: %Target% echo dir: %dir% echo zip: %zip% echo. echo test: %test% echo test2: %test2% ) ) else ( echo Not successful. ) 

Dies ist die Ausgabe einer brandneuen Instanz von cmd:

 C:\Users\RandomClown\Desktop>test.bat Version: 12345 Type: 456 Target: Client dir: zip: test: 42 test2: 

Was Sie beachten sollten, ist, dass die If-statement für eine einzige Zeile das Zeug korrekt einstellt. Die Multilinie if führt alles aus, was KEIN Satz ist. Ich glaube nicht, dass ich etwas verpasst habe. Außerdem führt die mehrzeilige if-statement die richtigen Zeilen korrekt aus, da die else ( echo Not successful. ) Zeilen else ( echo Not successful. ) nicht ausgeführt wurden.

Warum wurden die Zeilen nicht ausgeführt?

Du hast etwas verpasst 😉

cmd erweitert Variablen, wenn Befehle geparst werden , nicht wenn sie ausgeführt werden. Es kommt vor, dass eine if- oder for statement mit einem Block ( ... ) (oder eigentlich jeder Block) in diesem Fall als ein einziger Befehl ausgeführt wird. Wenn Sie also Variablen innerhalb eines Blocks setzen und versuchen, sie im selben Block zu verwenden, gibt es keine Variablen mehr – sie wurden durch die Werte ersetzt, die die Variablen hatten, bevor der Block überhaupt ausgeführt wurde.

Stick a

 setlocal enabledelayedexpansion 

am Anfang der Batchdatei und benutze !zip! anstelle von %zip% . Eine ausführliche Erläuterung des Problems finden Sie in der help set .

Nur zur Erinnerung, der ms-dos “set” -Befehl nimmt jede Zeichenkette nach dem Gleichheitszeichen. Also wenn du schreibst

 if "x"=="x" set a=foo else set a=bar echo %a% // output : foo else set a=bar 

% A% wird tatsächlich auf “foo else set a = bar” gesetzt, nicht foo. Daher verwende ich immer “()” für den Befehl set, wenn mehrere Befehle in einer Zeile stehen.

 if "%1"=="" (set a=20) else (set a=%1)