无法通过失败的脚本返回退出代码

时间:2016-03-14 13:51:20

标签: powershell

我有一个像这样简单的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脚本的任何执行错误导致它返回非零错误代码?

1 个答案:

答案 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"

您通常会将脚本中的常规退出代码返回给调用者。