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

标签 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>

可以看到,第一个echo是获取不到环境的。能帮忙评论一下吗?任何意见将不胜感激!

附言:操作系统:Windows 7 X64 家庭版

最佳答案

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

关于windows - 在一个 windows cmd 行中运行两个命令,一个命令是 SET 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9888806/

相关文章:

batch-file - 当他省略扩展名 .exe 以终止进程时,如何检查和更正用户输入?

windows - 如何在 Eclipse 中打开文件并跳转到特定行?

perl - 我可以在shebang行中将perl的开关与/bin/env一起使用吗?

windows - 如何检查 Lotus Notes 客户端中是否安装了升级包?

ubuntu - 我如何在 ubuntu 中安装 npm 以运行更少的 js

linux bash - 从每个文件夹 move x 百分比的文件

windows - 如何在批处理脚本中隐藏 'net use' 命令错误消息

windows - 将输出重定向到 VAR 指定的文件名

c# - 从 Windows 服务调用时,SetThreadExecutionState 不起作用

c - Linux 和 Windows 上的报警功能 -> 找不到 Windows 的等效功能 -> C