我知道powershell处理语法错误和退出代码的令人讨厌的行为。我有以下的repro案例应该被trap或try catch块捕获,但是没有一个被触发,即使$ErrorActionPreference
设置为stop
。
这里的代码不断出现错误代码0,这很烦人,因为没有调用陷阱机制来处理错误:
$ErrorActionPreference = "stop"
trap [Exception] {
echo "Trap encountered"
exit(1)
}
Try
{
function foo($path, $path)
{
}
}
Catch
{
echo "Caught something"
exit(1)
}
有人知道如何在这种情况下欺骗powershell正确退出吗?脚本中的语法错误会无声地破坏我们的CI,这是一个非常大的问题。
为清楚起见:这已经在Win 7 PS 3.0上测试和复制
编辑2:为了避免更多人说我不会因此而捕获语法错误。 Powershell的设计与您所知道的大多数其他脚本或编程语言不同。
您可以捕获语法错误,因为它们被视为终止错误。
如果出现语法错误或内存不足,则表示终止错误。可以捕获和处理终止错误。
答案 0 :(得分:1)
尝试/捕获捕获执行错误,而不是解析器错误。在PowerShell甚至开始执行脚本之前,将发生分析器错误。您可以通过帮助程序脚本调用它,而不是直接调用您的脚本,该脚本已知具有良好的语法。例如ScriptInvoker.ps1
param (
[Parameter(Mandatory=$true,Position=1)]
[string]$Path
)
$ErrorActionPreference = "stop"
try { &$Path }
catch { exit(1) }
现在您的CI系统只需要将您的临时脚本输出到temp.ps1
,而不是调用powershell -File temp.ps1
,而是使用powershell -File ScriptInvoker.ps1 temp.ps1
。
答案 1 :(得分:0)
我认为PS Script Analyzer可以做你想做的事情。 https://github.com/PowerShell/PSScriptAnalyzer
所以对我而言,它的工作原理如下:
尝试{Invoke-ScriptAnalyzer -ErrorAction Stop -Path。\} catch {Write-Output $ _} Invoke-ScriptAnalyzer:文件C中的解析错误:\ Users \ gleb_boushev \ Desktop \ Untitled2.ps1:第10行第24列的参数列表中的重复参数$ path。