PowerShell exit()命令会关闭PowerShell以及ISE。

3
所以我编写了一系列函数并将它们插入到一个PS模块(.psm1)中。其中之一是一个简单的ErrorAndExit函数,它向STDERR写入一条消息,然后调用exit(1);,这是一个习惯,可以方便地重定向错误消息。在调试我的脚本时,在普通PowerShell或ISE中,如果我调用一个调用ErrorAndExit的函数,它不仅会退出脚本,而且会退出整个PowerShell进程。终端和ISE都会立即关闭。终端我可能能够理解,但是ISE?最令人沮丧的部分当然是,在窗口消失之前,我看不到错误消息。
我认为这与我的调试方式有关-我定义了许多按顺序执行的函数,并注释掉了启动链的调用。我正在导入脚本并从提示符调用函数。由于该脚本旨在自动化,杀死整个PS进程在实际使用中不会成问题,但我需要看到调试输出。
Common.psm1中的相关函数:
function errorAndExit([string]$message)
{
    logError($message);
    exit(1);
}

logError$message传递给Write-Error。以下是一个示例函数,其中此调用导致PS或ISE死机:

function branch([string]$branchName, [int]$revision, [string]$jenkinsURL, [switch]$incrementTrunk)
{
    Set-Variable -Name ErrorActionPreference -Value Stop;
    log("Script starting, parameters branchName=$branchName, revision=$revision, jenkinsURL=$jenkinsURL");
    if (-not ($branchName -match "\d{4}\.\d{2}\.\d"))
    {
        errorAndExit("Provided branch name $branchName is not a valid YYYY.MM.R string");
    }
...

我的Common.psm1模块可以通过简单的Import-Module -Force "$PSScriptRoot\Common";导入。当从PS提示符调用时:
PS C:\Windows\system32> branch -branchName abc

导致PowerShell或ISE完全退出。

我从Bash的思维方式转向PowerShell,并编写了这样的脚本(逐渐习惯传递对象),但这不是我对任何脚本语言的预期行为。


如果你想让脚本在出错时停止运行,不要使用exit命令,而是设置$ErrorActionPreference = 'Stop' - undefined
@MathiasR.Jessen 是的,我已经在做了,看一下代码片段。这是关于首先引发错误的问题。 - undefined
@Gargravarr - 我们在PowerShell中不使用括号 - ( ) - 来执行函数。从语法上讲这是有效的,但从语义上讲是错误的。logError($message) 应该是 logError $messageexit(1) 应该是 exit 1,等等。 - undefined
3个回答

6

谢谢您的建议。Throw 是我所需要的;在其他语言中,我通常会调用 exit() 来立即停止脚本运行,因为我确定由于错误数据而需要终止脚本。我对使 exit() 终止整个 PowerShell.exe 进程(即使在脚本内部也是如此)的决定仍感到困惑。 - undefined
是的,PowerShell对函数的实现有点奇怪。我总是想到“return”,但实际上函数只是在添加到管道中,所以你必须小心,不要用其他命令将其添加到管道中。Throw可以工作,但前提是你已经设置好了异常处理机制。 - undefined
另外,Write-Error提供了一些更多的选项来生成错误,并且与PowerShell语言更加匹配。 - undefined

4

我不确定为什么你不能直接使用throw来抛出错误信息。如果你必须使用从exit返回的代码,但又不想在ISE中这样做,请考虑更改你的函数:

function errorAndExit([string]$message)
{
    logError $message
    if ($Host.Name -eq 'Windows PowerShell ISE Host') {
        throw $message
    } else {
        exit 1
    }
}

1
谢谢你的建议,你说得对,我没有使用正确的方法。我仍然觉得奇怪的是,exit()隐式地终止了整个PowerShell.exe进程。 - undefined

3

尝试使用Throw关键字,它用于引发异常,稍后可以在try-catch块中使用。


谢谢你的建议,看起来正是我所需要的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接