This simple command sequence runs expected in the Windows\' CMD shell:
dir & echo hello
will list the files and direct
You can also use cmd /V /C
(with /V
to enable delayed expansion).
That is great to set an environment variable for just one command in Windows cmd.exe
:
cmd /V /C "set "name=value" && echo !name!"
value
Note the usage of double-quotes in set "name=value"
to avoid the extra space after value
.
For instance, without double-quotes:
cmd /V /C "set name=value && echo '!name!'"
'value '
You would need to think to remove the space between value
and &&
:
cmd /V /C "set name=value&& echo '!name!'"
'value'
But using double-quotes makes the assignment more explicit.
Your result is due to the fact that %name% is expanded during the parsing phase, and the entire line is parsed at once, prior to the value being set.
You can get the current value on the same line as the set command in one of two ways.
1) use CALL to cause ECHO %NAME% to be parsed a 2nd time:
set name=value&call echo %^name%
I put a ^
between the percents just in case name was already defined before the line is executed. Without the caret, you would get the old value.
Note: your original line had a space before the &
, this space would be included in the value of the variable. You can prevent the extra space by using quotes: set "name=value" &...
2) use delayed expansion to get the value at execution time instead of at parse time. Most environments do not have delayed expansion enabled by default. You can enable delayed expansion on the command line by using the appropriate CMD.EXE option.
cmd /v:on
set "name=value" & echo !name!
Delayed expansion certainly can be used on the command line, but it is more frequently used within a batch file. SETLOCAL is used to enable delayed expansion within a batch file (it does not work from the command line)
setlocal enableDelayedExpansion
set "name=value" & echo !name!