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

时间:2012-03-27 11:35:50

标签: windows command-line cmd

[目的]

这个简单的命令序列在Windows' CMD shell:

dir & echo hello

将列出文件和目录并回显字符串。

但是,以下命令序列没有按预期运行(至少我是这样):

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

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

C:\Users\Administrator>

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

PS:操作系统:Windows 7 X64 Home Pre

2 个答案:

答案 0 :(得分:10)

您的结果是由于%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!

答案 1 :(得分:2)

您还可以使用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'

但是使用双引号会使赋值更明确。