【发布时间】:2019-11-21 05:52:22
【问题描述】:
我的 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 语句,所以它不会关闭控制台。
【问题讨论】:
-
您要解决什么问题(需要非零退出代码)?
-
我想在没有明确的 throw 语句的情况下指示失败。
-
为什么?抛出异常有什么问题?
-
屏幕上的垃圾太多了。我确实经常使用它,但我想知道退出代码,因此问题。
-
我正在努力了解您的目标。模块实现在当前范围内执行的功能。函数不会更改退出代码,因为它们仅由进程或脚本设置。虽然我猜你可以写
& $Env:ComSpec /c exit n?
标签: powershell