【问题标题】:How a ps1 script can set $LASTEXITCODE after running several tools?ps1 脚本如何在运行多个工具后设置 $LASTEXITCODE?
【发布时间】:2020-07-04 00:08:10
【问题描述】:

如果 .ps1 脚本仅运行一个工具,则该工具的退出代码会有效地传播到调用者,调用者可能是另一个 ps1 脚本或 shell。它可能导致 CI​​ 失败(这很好)。

但是如果一个 .ps1 脚本想要运行 两个 工具,并且如果 either 脚本失败,最终返回失败的退出代码,该怎么做呢?在第一个工具失败后运行第二个工具会从第一个工具中删除 $LASTEXITCODE,并在 CI 中“通过”。

即使直接在运行第一个工具之后,我也添加了这个:

    if ($LASTEXITCODE -ne 0) {
        exit 4
    }

脚本退出,但$LASTEXITCODE 仍等于0

我发现的其他一些技术具有非常负面的副作用,即使用退出代码终止 powershell.exe 进程,但我不想在用户直接运行 ps1 脚本时强制终止用户的 shell ,或者如果我的 ps1 脚本是从另一个 ps1 脚本调用的,我不想终止调用者。我只是想设置退出代码。

有没有办法在 PowerShell 中实现这一点?

【问题讨论】:

  • 您是说,执行powershell -command "exit 27" 并在之后检查$LASTEXITCODE,不会显示27

标签: powershell


【解决方案1】:

安德鲁,

您需要保存代码:

& ".\Test\Test-Exit27.ps1"
$Exit27 =  $LASTEXITCODE

& ".\Test\Test-Exit4.ps1"
$Exit4 = $LASTEXITCODE

"Results:`n Exit27 = $Exit27`n Exit4 = $Exit4"

每个调用的 .ps1 文件都包含一行 Exit #,例如27号出口。

结果:

Results:
 Exit27 = 27
 Exit4 = 4

HTH

【讨论】:

  • 不行。带有exit 27 的ps1 脚本甚至没有设置$LASTEXITCODE,在脚本执行后仍为0。如果脚本本身仍然返回 0,那么在脚本中捕获 $LASTEXITCODE 是没有意义的。
  • 多么奇怪。如您所说,它确实可以在干净的 Windows PowerShell 或 PowerShell Core 环境中工作,但在 VS Dev2019 PowerShell 提示符中却不行
  • 哦,这不是 VS PowerShell 提示符……它是 Posh-Git!当我在 git repo 中时,提示函数本身会清除 $LASTEXITCODE。感谢您坚持这样做。 :) 我会和 Posh-Git 的人一起讨论。
  • 我猜 posh-git 有这个错误,但很久以前就修复了。事实上,从我的 powershell 配置文件脚本来看,是 Set-Theme Paradox 负责。如果我将其注释掉,它会起作用。
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多