[目的]
这个简单的命令序列在Windows的CMD shell中运行:
dir & echo hello
将列出文件和目录并回显字符串。
但是,以下命令序列没有按预期运行(至少我是这样):
C:UsersAdministrator>set name=value & echo %name%
%name%
C:UsersAdministrator>echo %name%
value
C:UsersAdministrator>
正如我们所看到的,第一个回波无法到达环境。你能帮忙评论一下吗?任何评论都将不胜感激!
PS:OS:Windows 7 X64 Home预
您的结果是由于%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'
但是使用双引号会使赋值更加明确。