在一个Windows cmd行运行两个命令,一个命令是SET命令

[目的]

这个简单的命令序列在Windows的CMD shell中运行:

dir & echo hello 

将列出文件和目录并回显string。

但是,以下命令序列不能按预期运行(至less由我):

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

我们可以看到,第一个回声无法获得环境。 你能帮忙评论吗? 任何评论将不胜感激!

PS:操作系统:Windows 7 X64家庭前

Solutions Collecting From Web of "在一个Windows cmd行运行两个命令,一个命令是SET命令"

您的结果是由于%name%在解析阶段被扩展,并且在设置值之前一次解析整行。

您可以通过以下两种方式之一获取与set命令相同的行中的当前值。

1)使用CALL使ECHO%NAME%被第二次解析:

 set name=value&call echo %^name% 

如果在行被执行之前已经定义了名字,我在百分号之间加了一个^ 。 没有脱字符,你会得到旧的价值。

注意:你的原始行在&之前有一个空格,这个空格将被包含在变量的值中。 您可以通过使用引号来防止多余的空间: set "name=value" &...

2)使用延迟扩展来获取执行时的值而不是解析时的值。 大多数环境默认情况下没有启用延迟扩展。 您可以使用适当的CMD.EXE选项在命令行上启用延迟扩展。

 cmd /v:on set "name=value" & echo !name! 

延迟扩展当然可以在命令行上使用,但在批处理文件中使用得更为频繁。 SETLOCAL用于在批处理文件中启用延迟扩展(它不能从命令行运行)

 setlocal enableDelayedExpansion set "name=value" & echo !name! 

您也可以使用cmd /V /C (使用/V来启用延迟扩展)。
在Windows cmd.exe为一个命令设置一个环境变量是非常好的:

 cmd /V /C "set "name=value" && echo !name!" value 

请注意set "name=value"的双引号的用法,以避免value后的额外空间。
例如, 没有双引号:

 cmd /V /C "set name=value && echo '!name!'" 'value ' 

您需要考虑删除value&&之间的空格:

 cmd /V /C "set name=value&& echo '!name!'" 'value' 

但使用双引号使分配更加明确。