相关疑难解决方法(0)

PowerShell 和进程退出代码

这个自我回答的问题试图解决在 PowerShell中处理进程退出代码的两个不同方面:

  • 在 PowerShell 代码中,如何查询外部进程设置的退出代码(对外部程序的调用),这些退出代码如何与 PowerShell 的错误处理相结合?

  • 当其他人通过其 CLI pwsh(PowerShell Core)/ powershell.exe(Windows PowerShell)调用 PowerShell 时,什么决定了 PowerShell 进程的退出代码,该代码将成功与失败传达给调用进程(可能是构建/CI/自动化服务器任务) ,计划任务或不同的外壳,例如)。

error-handling powershell exit-code

16
推荐指数
1
解决办法
1万
查看次数

"|| exit /b" 和 "|| exit /b !errorlevel!" 之间的区别

我们有一堆.bat构建脚本,这些脚本由基于 PowerShell 的 GitLab 运行器调用,这些运行器最近重构为:

program args
if !errorlevel! neq 0 exit /b !errorlevel!
Run Code Online (Sandbox Code Playgroud)

更简洁:

program args || exit /b
Run Code Online (Sandbox Code Playgroud)

今天我调查了一个构建作业,如果您查看错误日志,该作业显然失败了,但报告为成功。经过大量实验,我发现这种模式并不总是按预期工作:

program args || exit /b
Run Code Online (Sandbox Code Playgroud)

但是当前者没有时,这似乎确实有效:

program args || exit /b !errorlevel!
Run Code Online (Sandbox Code Playgroud)

我已经阅读了 SO question Windows batch exit option b with or without errorlevel和下面来自https://www.robvanderwoude.com/exit.php的声明,但仍然不能完全解释我正在观察的内容。

DOS 联机帮助 (HELP EXIT) 没有明确说明 /B 参数退出当前脚本实例不一定与退出当前脚本相同。即,如果脚本在 CALLed 代码段中,则 EXIT /B 退出 CALL,而不是脚本。


这是我用来探索这个的最小批处理文件:

@echo off
setlocal EnableDelayedExpansion
cmd /c "exit 99" || exit /b
:: cmd /c …
Run Code Online (Sandbox Code Playgroud)

powershell cmd batch-file

12
推荐指数
3
解决办法
426
查看次数

从 PowerShell 调用批处理文件,并提供正确的退出代码报告,同时避免插入符号重复

我怀疑没有好的解决方案,但也许我忽略了一些事情:

我所追求的是一种方法:

  • (a) 从 PowerShell 调用批处理文件,其方式可以在 PowerShell 自动变量中稳健地$LASTEXITCODE反映其(隐式或显式)退出代码。

    • 值得注意的是,调用以 , 退出的批处理文件whoami -nosuch || exit /b应该会导致$LASTEXITCODE反映 的whoami退出代码,即1当您从 PowerShell 调用批处理文件(按名称或路径)时,情况并非如此:退出代码为0(相反,在cmd.exe会话内部设置为%ERRORLEVEL% 1

    • 另请注意,调用应与 PowerShell 的输出流保持集成,因此我并不是寻找基于System.Diagnostics.Process.

    • 此外,我知道或无法控制调用的批处理文件 - 我正在寻找通用的解决方案。

  • (b) 传递给批处理文件的双引号参数不会以任何方式被更改,并且cmd.exe的行为不会以任何方式被修改;尤其:

    • ^字符不应该(见下文)。
    • 启用延迟扩展不是一个/V:ON选项

我知道如何解决(a)的唯一方法是通过调用批处理文件cmd /c call

不幸的是,这违反了要求 (b),因为在参数中使用call看似总是双倍的^字符。(并且,相反,使用 …

powershell cmd batch-file exit-code parameter-passing

7
推荐指数
1
解决办法
834
查看次数