gpt4 book ai didi

powershell - 如何在不关闭 powershell 控制台的情况下从 Powershell 模块函数返回非零退出代码?

转载 作者:行者123 更新时间:2023-12-03 00:42:12 27 4
gpt4 key购买 nike

我的 powershell 模块有一个函数,我希望它返回一个非零退出代码。但是,作为一个模块函数,当我运行 Import-Module 时,它会加载到 powershell 控制台的上下文中。所以,当函数执行 exit 1 - 噗,控制台窗口出现了!

至少,我是这样解释它退出时关闭 powershell 窗口的。

那么,ps 模块函数如何以非零退出代码退出而不杀死导入模块的控制台?

附言

我确实注意到了关于这个主题的几个关于 SO 的问题,但似乎没有一个研究这个特殊案例。

编辑 1

我想提供一些背景信息。我有一个功能很多的PS模块。其中一些在 Azure DevOps yaml 构建脚本中按原样使用。后者知道识别非零退出代码并中止管道,因此没有必要从函数中抛出异常来中止流程。

但是,如果我想从控制台调用该函数,例如要快速测试某些东西并以非零代码退出,整个控制台窗口将关闭。这非常烦人。

有时有一个解决方法。所以,而不是这个代码:

dotnet build ...
$ExitCode = $LastExitCode
DoSomethingInAnyCase()
if ($ExitCode)
{
exit $ExitCode
}

我们可以有以下版本:

try
{
dotnet build ...
}
finally
{
DoSomethingInAnyCase()
}

两个版本都会正确返回正确的退出代码,但因为第二个版本没有显式的 exit 语句,所以它不会关闭控制台。

最佳答案

您必须设置 $global:LASTEXITCODE 才能设置退出代码,但请注意 PowerShell 函数 并不是真正用于设置退出代码,只有脚本,而后者仅用于通过 PowerShell 进程自己的退出代码向外界报告退出代码,当通过其 (例如,Windows PowerShell 的 CLI powershell.exe,PowerShell Core 的 pwsh)来自构建工具、计划任务或其他 shell。

另请注意,直接设置 $global:LASTEXITCODE:

  • 不会使自动成功状态变量 $? 在调用者的上下文中反射(reflect) $falseexit <nonzero-value> 从脚本中执行的方式以及调用报告非零退出代码的外部程序的方式。

  • 不足以使 PowerShell 进程作为一个整体报告此退出代码。

简而言之:所有这一切的好处是调用者可以在调用函数后检查 $LASTEXITCODE,就像调用外部程序一样。


通常,退出代码是一个进程间概念,并不适合 PowerShell 的进程内世界。

有关 PowerShell 中退出代码的详细信息,请参阅 this post


PowerShell 的退出代码模拟是 $? ,自动 bool 成功状态变量( $true$false ),它反射(reflect)了 PowerShell 命令之后立即成功。
(如果该命令是外部程序调用,则退出代码 0 会将 $? 设置为 $true ,并且任何非零代码都将其设置为 $false )。

事实证明,设置那个才是你真正想问的。

从 PowerShell Core 7.0.0-preview.5 开始,您不能直接设置 $?

目前,这些是使 $? 在调用者范围内反射(reflect) $false 的唯一方法,相反,您不能始终确保它是 $true:

  • 脚本:使用 exit <nonzero-integer> 退出脚本

  • 从 cmdlet 或函数(以及脚本):

    • 抛出脚本终止错误 (Throw) 或语句终止错误 ($PSCmdlet.ThrowTerminatingError()) - 后者仅在高级函数和脚本中可用。

    • 使用 $PSCmdlet.WriteError() 将错误写入 PowerShell 的错误流 - 后者仅在高级函数和脚本中可用。

      • 请注意,这出乎意料地目前适用于 Write-Error cmdlet - 请参阅 this GitHub issue

请注意,这两种技术总是涉及发出错误

因为这听起来正是您要避免的,您必须等到实现直接设置 $? 的能力

The decision to implement this ability has been made ,具体什么时候实现还不清楚。

关于powershell - 如何在不关闭 powershell 控制台的情况下从 Powershell 模块函数返回非零退出代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58968118/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com