Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

run two commands in one windows cmd line, one command is SET command

[purpose]

This simple command sequence runs expected in the Windows' CMD shell:

dir & echo hello

will list the files and directories and echo the string.

However, the following command sequence does not run as expected (at least by me):

C:\Users\Administrator>set name=value & echo %name%
%name%

C:\Users\Administrator>echo %name%
value

C:\Users\Administrator>

As we can see, the first echo cannot get the environment. Could you help to comment? Any comment will be appreciated!

PS: OS:Windows 7 X64 Home Pre

like image 686
SOUser Avatar asked Mar 27 '12 11:03

SOUser


People also ask

How do I run multiple commands in one line in Windows?

The semicolon ( ; ) character is used to separate multiple commands on a single line.

WHAT IS SET command in cmd?

The set command is often used in the Autoexec. nt file to set environment variables. If you use the set command without any parameters, the current environment settings are displayed. These settings usually include the COMSPEC and PATH environment variables, which are used to help find programs on disk.

Can you put two commands in one command block?

To make your command block run multiple commands, you will need to summon FallingSand or falling_block (depending on your version of Minecraft) with command blocks and redstone blocks for each command. The command blocks will be stacked one on top of the other and contain the individual command.


1 Answers

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!
like image 136
dbenham Avatar answered Nov 07 '22 20:11

dbenham