- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一堆 .bat
构建脚本由基于 PowerShell 的 GitLab 运行程序调用,这些脚本最近从以下内容重构:
program args
if !errorlevel! neq 0 exit /b !errorlevel!
更简洁:
program args || exit /b
今天我调查了一个构建作业,如果您查看错误日志,该作业显然失败了,但报告为成功。经过大量实验,我发现这种模式并不总是按预期工作:
program args || exit /b
但是当前者没有时,这似乎确实有效:
program args || exit /b !errorlevel!
The DOS online help (HELP EXIT) doesn't make it clear that the /B parameter exits the current instance of script which is not necessarily the same as exiting the current script.I.e. if the script is in a CALLed piece of code, the EXIT /B exits the CALL, not the script.
@echo off
setlocal EnableDelayedExpansion
cmd /c "exit 99" || exit /b
:: cmd /c "exit 99" || exit /b !errorlevel!
这就是我调用批处理文件的方式(以模拟基于 GitLab PowerShell 的运行程序如何调用它):
& .\test.bat; $LastExitCode
以下是根据批处理文件中两行中的哪一行执行的输出:
PS> & .\test.bat; $LastExitCode
0
PS> & .\test.bat; $LastExitCode
99
CALL
从 PowerShell 中直接调用批处理文件。还有:
PS> & cmd.exe /c "call .\test.bat"; $LastExitCode
99
虽然我很欣赏这可能是从 PowerShell 调用批处理文件的正确方法,但根据我见过的许多示例,这似乎不是常识。我也想知道为什么 PowerShell 不以这种方式调用批处理文件,如果它是“正确的方式”。最后我还是不明白为什么,当离开
call
时,行为会根据我们是否添加
!errorlevel!
而改变。到
exit /b
声明。
errorlevel
在以下语句中(据说)进行评估:
program || exit /b
是否真的像这样早期评估(即在
program
运行之前):
program || exit /b %errorlevel%
或者它是否被懒惰地评估(即当
exit
在
program
运行后执行并且内部
errorlevel
已更新时),更类似于:
program || exit /b !errorlevel!
因此,我并不是真的在猜测,除非遗憾的是,这是我们能做的最好的事情,在这种情况下,知道没有明确的答案或者这是一个错误对我来说是可以接受的答案:o)。
最佳答案
解决方法 :
cmd /c <batch-file> ... `& exit
调用您的批处理文件 ,在这种情况下 || exit /b
没有显式退出代码的解决方案按预期工作。cmd /c .\test.bat `& exit
`
-逃脱&
,这会阻止 PowerShell 解释 &
前面。省略 `
如果您从不涉及 shell 的环境(例如从计划任务)运行命令。 cmd /c "<batch-file> ... & exit"
,但这需要转义任何 "
作为参数一部分的字符(或使用 here-string )。如果没有使用 PowerShell 变量或表达式,则可以选择单引号来避免该问题:cmd /c '<batch-file> ... & exit'
cmd /c <batch-file> ... `& exit
例行从外部调用批处理文件 cmd.exe
建议 , 甚至没有明确的批处理文件 exit /b
(或 exit
)调用可能会出现意外行为 - 参见 this answer .cmd /c
的一部分。不是最后一个命令的多命令命令行[1] - 你可以使用 || exit
而不是 || exit /b
- 这将退出正在执行的 cmd.exe
立即处理整个过程,但随后可靠地报告退出代码(错误级别)(至少在 <command> || exit
语句的上下文中)也可以从外部直接调用 cmd.exe
,例如 & .\test.bat
(或者,在这个简单的情况下,只是 .\test.bat
)来自 PowerShell。setlocal EnableDelayedExpansion
与
exit /b !ERRORLEVEL!
也可以工作(除了在
(...)
内部 - 参见
this post ) - 由于使用了显式退出代码 - 它显然更麻烦并且可能有副作用,特别是悄悄删除
!
来自命令的字符,例如
echo hi!
(虽然可以通过将
setlocal EnableDelayedExpansion
调用放在
exit /b
调用之前的行上来最小化该问题,但如果有多个退出点,则需要重复)。
cmd.exe
的行为令人遗憾在这种情况下,但无法避免。
cmd.exe
:
exit /b
- 没有退出代码(错误级别)参数 - 只设置 cmd.exe
按预期处理退出代码 - 即批处理文件中最近执行的命令的退出代码 - 如果您跟随批处理文件调用 & exit
,即 cmd /c <batch-file> ... `& exit
& exit
解决方法,无参数 exit /b
来自批处理文件的调用反射(reflect)在 %ERRORLEVEL%
中可变内部- cmd.exe
-session,但这不会转化为 cmd.exe
的进程退出代码,然后默认为 0
.[1]& exit
解决方法,批处理文件内无参数 exit /b
是否正确设置 cmd.exe
的退出代码,即使在 <command> || exit /b
声明,在这种情况下 <command>
的退出代码按预期传递。exit /b <code>
,即传递退出代码 <code>
明确地,始终有效 [2],即 & exit
然后不需要解决方法。cmd /c call ...
解决方法,但它同样适用于 cmd /c "... & exit"
)。cmd /c
,可以传递多条语句执行,最后一条语句决定了
cmd.exe
进程的退出代码。例如,
cmd /c "ver & dir nosuch"
报告退出代码
1
,因为不存在的文件系统项
nosuch
造成
dir
将错误级别设置为
1
,无论前面的命令 (
ver
) 是否成功。不一致之处在于,对于名为
test.bat
的批处理文件以
exit /b
退出没有明确的退出代码参数,
cmd /c test.bat
总是报告
0
, 而
cmd /c test.bat `& exit
正确报告批处理文件退出之前执行的最后一条语句的退出代码。
cmd.exe
的前期变量扩展 -
<command> || exit /b %ERRORLEVEL%
无法按预期工作,因为
%ERRORLEVEL%
此时扩展到此语句之前的错误级别,而不是由
<command>
设置的错误级别。 ;这就是延迟扩张的原因,通过运行
setlocal enabledelayedexpansion
或已调用
cmd.exe
与
/V
选项,在这种情况下是必需的:
<command> || exit /b !ERRORLEVEL!
关于powershell - "|| exit/b"和 "|| exit/b !errorlevel!"的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66248276/
登录Desktop Rstudio后,会出现以下消息: Error in yaml.load(readLines(con), error.label = error.label, ...) : o
在 cmd.exe 中运行 MS DOS 命令后,我使用 echo %ERRORLEVEL% 检查退出代码。不过我想在运行这个之前我应该清除变量:%ERRORLEVEL%。 我说得对吗?另外如何清
我想读取Java中cmd命令的返回码。为此,我使用了: Runtime.exec("echo %errorlevel%") 但不是回显错误代码,而是回显 %errorlevel%。 最佳答案 不知道你
我有一个嵌套的批处理脚本,我希望它的错误代码渗透到调用它的主批处理脚本。我试过了 exit /b %errorlevel% 但是变量没有返回。调用的批处理脚本中的 ECHO'ing %errorlev
我正在尝试以下命令并希望退出我的process(%ERRORLEVEL%)。但它返回 previous(last) 执行 sample.exe 的退出代码结果。我想获取当前命令的退出代码。我的要求是在
在启动 Jmeter 时,出现以下错误: VM 初始化期间发生错误无法为对象堆保留足够的空间 errorlevel=1。 请帮我解决这个问题。我使用的是 4GB RAM、64 位操作系统、intel
我正在学习 Windows 批处理脚本。当复制、移动或删除操作失败时,我需要提出错误。我制作了一个示例脚本,由于某种原因,当操作失败时,我无法让 ERRORLEVEL 上升。我运行脚本,文件不存在或在
我正在使用 Windows 批处理文件比较来自 2 个文件夹的文件列表。它打印结果,无论是通过还是失败。 当前工作批处理文件: for /F "tokens=*" %%f in (list.txt)
刚刚用 %ERRORLEVEL% 偶然发现了一件奇怪的事情并想看看是否有人知道原因以及是否有办法解决它。本质上,似乎在 if 语句中执行的命令没有设置 %ERRORLEVEL%多变的。 ERRORLE
由于 ERRORLEVEL 是一个环境变量,所以在我有机会在我的批处理文件中检查它之前,是否可以更改它的值? 最佳答案 环境变量属于当前“进程”,因此无法从外部更改它们。如果您在批处理文件中的相关命令
我试图找到一种方法来查看主机是否在 Windows 的 C 中处于事件状态,因此我使用 ping 命令运行系统,然后运行系统检查 %ERRORLEVEL% 但它始终显示 0,即使主机无法访问也是如此.
在命令提示符下,试试这个: powershell aaa echo ErrorLevel is %errorlevel% Powershell 将失败(出现错误)。您还会看到“ErrorLevel i
假设我们想使用以下命令在 Windows 中创建一个空文件: type nul > C:\does\not\exist\file.txt 目录不存在,所以报错: The system cannot f
我有一个为 C# 项目运行一些命令的构建后事件。最后一个命令有时会导致 ERRORLEVEL 值不等于零,然后构建失败。 我想附加一行额外的命令以始终将 ERRORLEVEL 值设置为零。最方便的方法
我的 Windows 机器桌面上有一个最小的批处理脚本,它使用 FC.exe 工具,用于比较我桌面上的两个文本文件。 我要比较的文件 file1.txt 包含一个字符 a file2.txt 包含一个
我想使用“wmic”命令来确定特定的 java 进程是否仍在运行。 例如> wmic 进程,其中“commandLine like '%ACTMonitor%' and executablePath
我试图从作为 QProcess 运行的 Windows 命令行应用程序中捕获特定的错误代码。 我今天有一个错误,应用程序失败: 在命令行上运行时: echo %errorleve% 返回 14001
我们有一个程序偶尔会崩溃。客户从计划任务运行程序。当程序以特定参数运行时,程序作为接口(interface)引擎运行,创建一个文件,然后将该文件ftp'到另一个服务器以供另一个程序导入。 我想知道我是
Windows shell 有一个 %ERRORLEVEL% 变量,可用于查找已通过 shell 运行的进程的退出代码。因此,我可以在 .bat 文件中使用它来获取我从 .bat 文件中调用的外部脚本
我想知道是否可以从 Ant build xml 中的批处理文件获取返回值。 我的批处理文件返回 %ERRORLEVEL% 值(在我的情况下,批处理文件返回 2)。我想知道是否可以捕获此问题并在 Ant
我是一名优秀的程序员,十分优秀!