如果批处理文件在交互式 CMD 中运行,为什么 `||` 在批处理文件中的工作方式不同?

问题描述 投票:0回答:0

假设我有批处理文件

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
给出与交互式运行相同的结果。我想这是有道理的,因为它是一个新的交互式外壳。

为什么这很重要

我知道如何解决这个问题。以下之一(或两者):

  1. ||
    &&
    的任何使用都应与
    call
    配对。
  2. 始终使用
    cmd.exe /c exit %ERRORLEVEL%
    .
  3. 退出批处理文件

在这里查看更多信息:为什么 Windows 批处理文件 `exit` 不能与 `||` 一起工作?)。

我的真正目标是编写一个单元测试以确保我的批处理文件在失败时正确传播错误,但是因为单元测试没有使用交互式 shell,所以它不会重现问题。

batch-file cmd errorlevel
© www.soinside.com 2019 - 2024. All rights reserved.