PowerShell exit()杀死shell和ISE

时间:2016-08-15 13:34:37

标签: powershell exit powershell-ise

所以我编写了一系列函数并将它们插入到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并且已经编写了脚本(但习惯于传递对象),但这不是我期望从任何脚本语言中获得的行为。

3 个答案:

答案 0 :(得分:3)

在Powershell ISE中,exit命令关闭整个IDE,而不仅仅关闭当前命令选项卡。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/13223112-would-be-better-if-the-exit-command-in-powershell

您在errorAndExit函数中使用exit有点瑕疵。如上所述,throwreturn $false并评估结果将是更好的选择。

答案 1 :(得分:2)

我不确定为什么你不能只是throw你的错误信息。如果您必须使用exit中的返回码,但又不想在ISE中执行此操作,请考虑更改您的功能:

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

答案 2 :(得分:1)

尝试使用Throw关键字,以便提出以后可以在try-catch块中使用的异常。