.png)
set var1=Demo
set var2=%var1%
echo %var2%
rem Output:Demo
Warum set var2
funktioniert das Folgende nicht, wenn es in einer Zeile mit steht set var1
?
set var1=& set var2=
set var1=Demo& set var2=%var1%
echo %var2%
rem output:%var1%
Wie kann ich in einer Zeile set var2
beginnen ?var1
Antwort1
Warum funktioniert es nicht set var2
, wenn es in einer Zeile mit steht set var1
?
AlsAbonnierenweist darauf hin:
Die Variablenersetzung wird in der gesamten Befehlszeile durchgeführt, bevor die Zeile ausgeführt wird. Zu diesem Zeitpunkt
var1
ist die Variable noch nicht definiert.
Sie können diese Einschränkung durch eine verzögerte Erweiterung umgehen:
@echo off
setlocal enabledelayedexpansion
set var1=Demo & set var2=!var1!
echo %var2%
endlocal
Beispiel:
F:\test>test
Demo
Weitere Informationen
- Ein AZ-Index der Windows CMD-Befehlszeile | SS64.com
- Windows CMD-Befehle (kategorisiert) - Windows CMD - SS64.com
- Parsen – Wie analysiert der Windows-Befehlsinterpreter (CMD.EXE) Skripte? – Stack Overflow
- EnableDelayedExpansion – Windows CMD – SS64.com
- Endlocal - Lokale Umgebungsvariablen - Windows CMD - SS64.com
- Setlocal - Lokale Variablen - Windows CMD - SS64.com
Antwort2
Die Variablenersetzung wird in der gesamten Befehlszeile durchgeführt, bevor die Zeile ausgeführt wird. Zu diesem Zeitpunkt var1
ist die Variable noch nicht definiert.
Die Regeln für eine undefinierte Variablensubstitution lauten:
- Bei der interaktiven Eingabe der Variable erfolgt keine Ersetzung und der Text bleibt
%var1%
- Bei Verwendung in einer Batchdatei wird die Variable durch eine Nullzeichenfolge ersetzt.
Sie müssen diesen Einzeiler in zwei Zeilen aufteilen, damit var1
er einen Wert hat. Oder lesen Sie die Antwort von @DavidPostill.
Antwort3
Sie können dies tun, ohne die verzögerte Erweiterung (ohne " setlocal enabledelayedexpansion
") zu verwenden, indem Sie eine "for" (Schleife) mit "call" verwenden.
@echo off
set "var1=" & set "var2="
echo var1=[%var1%], var2=[%var2%]
:rem The one-liner:
set "var1=Demo" & for /f "usebackq delims=" %%a in (`call echo ^%var1^%`) do @set "var2=%%a"
::
echo var1=[%var1%], var2=[%var2%]
:end
Die Ausgabe:
var1=[], var2=[]
var1=[Demo], var2=[Demo]
Sie können sogar eine zweite „for“-Schleife hinzufügen, um „echo var2“ in derselben Zeile auszuführen:
:rem The one-liner:
set "var1=Demo" & for /f "usebackq delims=" %%a in (`call echo ^%var1^%`) do @set "var2=%%a" & for /f "usebackq delims=" %%a in (`call echo var2^=[^%var2^%]`) do @echo %%a
::
:end
Die „endgültige“ Ausgabe:
var2=[Demo]
Hier ist die Aufschlüsselung von „for“ und „call“:
for /f "usebackq" %%a Operates on a command that is enclosed in `backquotes`.
Executes that command and captures the output of that
command into variable %%a.
"delims=" Disables all delimiters when parsing the command
output. Default delimiters are "space" and "tab".
Not required for this specific example.
Used when the command output might contain delimiters.
(`call echo ^%var1^%`)
(`call echo var2^=[^%var2^%]`)
Use "call" to execute the echo command within a
separate process.
"^" escapes special characters like "%" and "=" when
the command is read by "for".
do @set "var2=%%a"
do @echo %%a Sets the variable "var2" from the output of the
command in the for loop.
In this case, the for command will execute just once.
If the output of the command spanned multiple lines,
the for command would execute once for each non-empty
output line.