批处理脚本 - 使用管道时未设置环境变量

batch scripting - environment variables are not set when using pipe

我有 2 个脚本:

  1. set_env_var.bat - 如果按下“y”则设置环境变量。
  2. install.bat - 安装我的项目 - 取决于 set_env_var.bat 环境变量。

我正在尝试 运行 在单个 cmd 指令中执行这些脚本:

echo y| set_env_var.bat && install.bat

当我 运行 以这种方式设置时,我无法找到 set_env_var.bat 设置的任何环境变量,而不是来自 cmd 或 install.bat。

我猜 set_env_var.bat 是在新的 CMD 上启动的 运行那样...

知道如何解决吗?

是的,管道 | 为任何一方启动了两个新的 cmd 实例,任何环境变化最终都会丢失。

您可以创建一个“是”文件(仅包含 y 的文本文件),然后使用输入重定向:

< "yes.txt" "set_env_var.bat" && "install.bat"

您甚至可以包括它的创建和删除:

(echo y) > "yes.txt" && < "yes.txt" "set_env_var.bat" && "install.bat" & del "yes.txt"

echo y 两边的括号防止返回无意的尾随 SPACE


虽然在这种特殊情况下不是绝对必要的(因为所有命令都在一行中),您仍然应该遵循 Mofi's 并使用 call 来调用批处理文件从另一个确保执行 returns 到主脚本,特别是因为正确处理条件执行(使用运算符 &&||):

(echo y) > "yes.txt" && (< "yes.txt" call "set_env_var.bat" && call "install.bat" & del "yes.txt")

括号和命令连接运算符(&&&)是有意使用的:

  • 第一对括号仍然避免将尾随 SPACE 写入 yes.txt;
  • 第二对,连同&&&,控制执行流程:
    • 尝试创建yes.txt;只有在成功时,才执行下面的命令,它是整个带括号的余数;
      • 呼叫set_env_var.bat;
      • 仅在 set_env_var.bat 成功后调用 install.bat;
      • 独立于前面命令的成功,尝试删除 yes.txt;

在此上下文中,成功表示退出代码为零,而失败表示 non-zero 退出代码。

请注意,如果不对批处理文件使用 call,运算符 &&|| 可能会导致意外结果。