所以我编写了一系列函数并将它们插入到一个PS模块(.psm1)中。其中之一是一个简单的ErrorAndExit函数,它向STDERR写入一条消息,然后调用
我认为这与我的调试方式有关-我定义了许多按顺序执行的函数,并注释掉了启动链的调用。我正在导入脚本并从提示符调用函数。由于该脚本旨在自动化,杀死整个PS进程在实际使用中不会成问题,但我需要看到调试输出。
Common.psm1中的相关函数:
我的Common.psm1模块可以通过简单的
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( )
- 来执行函数。从语法上讲这是有效的,但从语义上讲是错误的。logError($message)
应该是logError $message
,exit(1)
应该是exit 1
,等等。 - undefined