批处理脚本 - 使用管道时未设置环境变量
batch scripting - environment variables are not set when using pipe
我有 2 个脚本:
- set_env_var.bat - 如果按下“y”则设置环境变量。
- 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
,运算符 &&
和 ||
可能会导致意外结果。
我有 2 个脚本:
- set_env_var.bat - 如果按下“y”则设置环境变量。
- 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
,运算符 &&
和 ||
可能会导致意外结果。