假设我有批处理文件
one.cmd
:
@two.cmd && echo success || echo fail
和
two.cmd
:
@exit /b 1
如果我在交互式 CMD 提示符下运行它,它会以一种方式运行:
D:\>one.cmd
success
但是如果我在
cmd /c
下运行它,它的行为会有所不同:
D:\>cmd /c one.cmd
fail
这是为什么?
PowerShell 和 Python 的
subprocess.run
都给出与 cmd /c
相同的结果。
cmd /k
给出与交互式运行相同的结果。我想这是有道理的,因为它是一个新的交互式外壳。
我知道如何解决这个问题。以下之一(或两者):
||
和&&
的任何使用都应与call
配对。cmd.exe /c exit %ERRORLEVEL%
.在这里查看更多信息:为什么 Windows 批处理文件 `exit` 不能与 `||` 一起工作?)。
我的真正目标是编写一个单元测试以确保我的批处理文件在失败时正确传播错误,但是因为单元测试没有使用交互式 shell,所以它不会重现问题。