我有一个像这样简单的PowerShell脚本:
Set-Strictmode -version Latest
$ErrorActionPreference = 'Stop'
try
{
Write-Host "aaa $(MyFunc "bbb)"
}
catch
{
Write-Host "Caught the error!"
Write-Host $error
exit 666
}
(请注意,此脚本在第一个写主机行中有错误。)
我需要以这样的方式运行脚本:如果有任何错误,它将以非零值返回。这是设置“Set-Strictmode”,“$ ErrorActionPreference”,并将其全部包装在try ... catch块中的目的。
但是,当我从windows cmd.exe运行它时,您可以看到错误没有被捕获,并且它没有返回错误代码:
D:\jjj>powershell -F jjj.ps1
At D:\jjj\jjj.ps1:6 char:28
+ Write-Host "aaa $(MyFunc "bbb)"
+ ~~~~~
The string is missing the terminator: ".
At D:\jjj\jjj.ps1:6 char:34
+ Write-Host "aaa $(MyFunc "bbb)"
+ ~
Missing closing ')' in subexpression.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
D:\jjj>echo Exit Code is %errorlevel%
Exit Code is 0
我怀疑错误行中不匹配的引号会严重破坏解释,以至于try ... catch块永远不会被正确实例化。
所以,问题是:我能做些什么来确保我的PowerShell脚本的任何执行错误导致它返回非零错误代码?
答案 0 :(得分:3)
那里有语法错误,而不是运行时错误。除了实际修复它,你无能为力。语法错误无法在运行时捕获,因为它们在PowerShell分析代码时发生,即在指令实际执行之前。
如果您从PowerShell中运行脚本,automatic variable $?
将设置为$false
。如果您在新的powershell
流程中运行它,请执行以下操作:
powershell "C:\path\to\your.ps1"
错误级别(PowerShell中的$LASTEXITCODE
)将在错误时设置为1。遗憾的是,使用-File
参数运行脚本时未设置errorlevel:
powershell -File "C:\path\to\your.ps1"
您通常会将脚本中的常规退出代码返回给调用者。