无法捕获或捕获语法错误

时间:2016-11-09 12:46:47

标签: powershell windows-7 powershell-v3.0

我知道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的设计与您所知道的大多数其他脚本或编程语言不同。

您可以捕获语法错误,因为它们被视为终止错误。

  

如果出现语法错误或内存不足,则表示终止错误。可以捕获和处理终止错误。

请参阅http://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell

2 个答案:

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