为什么 Windows 批处理文件“exit”不能与“||”一起使用?

2024-05-12

批处理/命令脚本中的通常建议是使用exit /b设置时退出ERRORLEVEL来指示错误。然而这与 CMD 的配合不太好|| and &&运营商。如果我在 CMD 命令行运行这些:

C:\>echo @exit /b 1 > foo.cmd

C:\>foo.cmd && echo success || echo fail
success

(预期输出是fail).

据 ss64.com 报道 https://web.archive.org/web/20230315075002/https://ss64.com/nt/errorlevel.html这是因为“退出代码”和ERRORLEVEL并不总是相同的exit可以返回成功(0) 以非 0 退出时的退出代码ERRORLEVEL, and exit code is what ||/&&`正在关注。

有趣的是,添加call使它按我的预期工作:

C:\>call foo.cmd && echo success || echo fail
fail

但要求每次使用||/&&也使用call将负担放在脚本的使用者身上,而不是脚本的实现上。

这可能有用的一个例子是,如果我有一个build.cmd脚本和一个test.cmd脚本,我可能想运行build && test.

https://ss64.com/nt/syntax-conditional.html https://ss64.com/nt/syntax-conditional.html and https://ss64.com/nt/exit.html https://ss64.com/nt/exit.html不要提及这种行为,即使该网站通常对批次怪异现象非常彻底。

为什么CMD会这样?有什么选择可以避免这个问题?


使用 CMD 的三个示例:

C:\> Echo @exit /b 3 > throw_err.cmd
C:\> CMD /c throw_err.cmd && echo Success || echo Error: %errorlevel%
1

C:\> CMD /K throw_err.cmd && echo Success || echo Error: %errorlevel%
C:\> exit
3

C:\> Echo @exit 3 > throw_err.cmd
C:\> CMD /c throw_err.cmd && echo Success || echo Error: %errorlevel%
3

从 PowerShell(带或不带 /b):

PS C:\> ./throw_err.cmd
PS C:\> $lastExitCode
3

当你已经在 CMD 提示符下时,必须调用一个新的 CMD 实例,只是为了获得模糊的合理错误处理,这似乎有点啰嗦,我想我更喜欢通过 PowerShell 调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Windows 批处理文件“exit”不能与“||”一起使用? 的相关文章

随机推荐

  • 如何查询多对多表(一个表的值成为列标题)

    给定此表结构 我想展平多对多关系 并将一个表的名称字段中的值设置为列标题 并将同一表中的数量设置为列值 目前可行的想法是将值放入字典 哈希表 中并用代码表示这些数据 但我想知道是否有 SQL 方法可以做到这一点 我还使用 Linq to S
  • 代码编译期间遇到警告消息“使用或覆盖已弃用的 API”

    我编译了我的程序并收到以下错误 我该如何解决呢 Note ClientThreadClients java uses or overrides a deprecated API Note Recompile with Xlint depre
  • 动画图像视图

    目前我正在开发一款游戏 这是我的游戏的详细信息 用户应选择正确的图像对象 我希望图像从左到右加速 当他们到达终点时 他们应该再次出现在活动中 这是我正在处理的屏幕截图 我有 5 个图像视图 它们应该会加速 您有此类动画的示例代码吗 非常感谢
  • 将光栅图像转换为矢量图形的建议

    如果一个人想要将大量光栅图像批量转换为矢量图形 是否有任何工具可以很好地做到这一点 例如 考虑任何具有标准形状 椭圆形 矩形 和文本的图表 Inkscape 用途 http www inkscape org doc tracing tuto
  • 如何修复在 Windows 终端中启动“powershell.exe”时出现的错误 0x800700c1?

    最近我在 Windows 终端中遇到以下错误 error 0x800700c1 when launching C Users Dry C Desktop AppData Local Microsoft WindowsApps Microso
  • Delphi中的抽象类

    我正在使用一个具有许多抽象类的组件套件 现在我想应用多态性 但在创建对象时收到错误抽象类 即使我不需要 我是否应该重写所有虚拟方法 有什么解决方法或解决方案吗 为了创建类的实例 您需要重写所有声明为虚拟抽象的方法 即使您不使用它们 如果您确
  • ListView ColumnHeader.Name 为空字符串

    我创建了一个 WinFormsListView作为具有四列的详细视图 我在设计器中为每一列指定了名称 但是在访问每一列时ColumnHeader通过ListView Columns属性 我找到每个ColumnHeader Name是一个空字
  • TextBoxFor @Value(大写)而不是@value

    这只是出于好奇 为什么这段代码有效 Html TextBoxFor x gt x Age new Value 0 这不是 Html TextBoxFor x gt x Age new value 0 请注意其中的大写 V Value I k
  • 如何从左向右滑动文本和图像并具有滑动效果[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PySpark:如何将带逗号的列指定为小数

    我正在使用 PySpark 并加载csv文件 我有一列包含欧洲格式的数字 这意味着逗号替换点 反之亦然 例如 我有2 416 67代替2 416 67 My data in csv file looks like this ID Reven
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • 将 HttpApi 与 I/O 完成端口结合使用

    我刚刚偶然发现了微软的HTTP 服务器 API http msdn microsoft com en us library aa364510 28v vs 85 29 aspx 简介中写道 HTTP 服务器 API 使应用程序能够通过 HT
  • sqlite 插入表中 select * from

    我需要在 Android 应用程序中将数据从一个表移动到另一个表 我想使用以下sql insert into MYTABLE2 select id STATUS risposta DATETIME now data ins from MYT
  • void、VOID、C 和 C++

    我有以下代码 typedef void VOID int f void int g VOID 它在 C 中编译得很好 在 Fedora 10 上使用 gcc 4 3 2 编译为 C 的相同代码给出以下错误 void c 3 error
  • 使用 JPype - 如何访问 JDBC 元数据函数

    我在用着杰 德贝API https launchpad net jaydebeapi它使用 JPype 加载 FileMaker 的 JDBC 驱动程序并提取数据 但我也希望能够获取所有表的列表在数据库中 In the JDBC 文档 ht
  • 动态 SQL 和 where case 哪个更好?

    我需要创建一个带有 12 个参数的存储过程 并使用这些参数的不同组合来过滤查询 所有 12 个参数都不是强制性的 就好像我传递 3 5 或 12 个参数取决于用户输入的搜索输入一样 我可以通过两种方式创建 即使用动态 SQL 查询或使用 C
  • C#.NET 将解决方案中各个项目的 settings.settings 文件编译为 1 个配置文件

    我有一个解决方案 其中一个项目是业务层 另一个项目是Web前端 其中有BL项目作为参考 它们每个都有自己的 settings settings 文件 但在构建时 BL 配置文件不会复制到 bin 目录中 我们之前解决这个问题的方法是将 BL
  • Google App Engine 实例未启动

    我有一个 GAE 申请 通常 当我部署应用程序的某个版本时 几乎会自动为其创建一个实例 但有时 GAE 不会启动新实例 我可以等24小时 但什么也没发生 我必须多次部署相同的版本 直到最终 GAE 为其创建一个实例 坦率地说 这很烦人 这种
  • 从 DecorView@2da7146[MyActivity] 中找不到 ViewTreeLifecycleOwner

    从撰写更新后alpha 11 to alpha 12 or beta 01 每当我打开具有撰写视图的活动或片段时 我都会遇到此崩溃 我在用AppCompatActivity它实现了LifecycleOwner 所以这非常奇怪 java la
  • 为什么 Windows 批处理文件“exit”不能与“||”一起使用?

    批处理 命令脚本中的通常建议是使用exit b设置时退出ERRORLEVEL来指示错误 然而这与 CMD 的配合不太好 and 运营商 如果我在 CMD 命令行运行这些 C gt echo exit b 1 gt foo cmd C gt