【问题标题】:run two commands in one windows cmd line, one command is SET command在一个 windows cmd 行中运行两个命令,一个命令是 SET 命令
【发布时间】:2012-04-10 22:35:18
【问题描述】:

[目的]

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

dir & echo hello

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

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

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

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

C:\Users\Administrator>

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

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

【问题讨论】:

  • 您的简单实验证明 Windows cmd-line-evaluation(与大多数 shell 程序一样)无法传播对同一处理行上的变量所做的分配。很高兴您在很短的时间内就发现了这个*功能*/限制。除非您的 cmd 环境包含类似 Unix shell eval 的东西,否则您必须将两个 cmd 放在单独的行上,即 set name=value 换行 echo %name%。祝你好运。
  • @shellter - 不太正确。确实,%name% 在设置的同一行时不会给出当前值,但延迟扩展会。
  • @dbenham :感谢您提供的信息,关于 Windows cmd,我还有很多不知道的地方。这就是为什么我将此作为评论留下的原因,您的答案看起来很全面。感谢分享。 +1!
  • @shelter - 也许您现在应该删除不正确的 cmets?

标签: windows command-line cmd


【解决方案1】:

您的结果是由于在解析阶段扩展了 %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!

【讨论】:

  • 非常感谢您知识渊博的 cmets!第一个看起来非常简洁!所以我会选择第一个! :)
  • 注意:如果上面的第一个解决方案在批处理文件中使用,请使用 set name=value&call echo %%name%% 等第二个解决方案对 % 进行转义
  • 编辑 - 将 ^ 添加到 CALL 解决方案中,以防万一名称已使用旧值定义。
  • 这里有一个小计数器的例子:set /a "count=count+1" & call echo Date: %date% Time: %time% __Run: %^count%
  • for循环有问题,我不能强制打印新时间,我同时进入所有行for /L %i in (1,1,100) do (set myString=%time:~0,2%_%time:~3,2%_%time:~6,5%& call echo %^myString% & timeout 2)
【解决方案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'

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

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 2023-04-06
    • 2018-03-15
    • 1970-01-01
    • 2017-05-05
    • 2013-01-22
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多