【发布时间】:2016-11-09 12:46:47
【问题描述】:
我知道 powershell 在处理语法错误和退出代码时的不良行为。我有以下重现案例,应该被陷阱或 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 的设计与您所知道的大多数其他脚本或编程语言不同。
您可以捕获语法错误,因为它们被视为终止错误。
如果出现语法错误或内存不足,则为终止错误。可以捕获和处理终止错误。
【问题讨论】:
-
对我来说出错了:“function foo($path, $path) + ~~~~~~ Duplicate parameter $path in parameter list。”
-
在我的系统上,
powershell -command "function foo($a, $a) {}"的退出代码为 1,而成功运行的退出代码为 0。从 CI 中检测错误至少应该是可行的。如果你真的想从 PowerShell 本身处理这个问题,你当然可以递归调用 (blech) 或者你可以尝试利用Parser类(从 3.0 开始)在执行之前解析任何脚本。 -
@4c74356b41 会,但不会调用陷阱,如果您检查退出代码,它将为 0,无论红色错误文本如何。
-
@JeroenMostert 这是一个示例,我们的脚本要复杂得多,我们的 CI 执行 powershell -f tempfile.ps1。似乎不鼓励使用 powershell -command。解析器在这里不起作用,因为这个脚本被 CI 放入一个临时文件中,我无权访问它。
-
@Samuel:它的目的是作为一个例子。
powershell -f .\script.ps1在退出代码方面做同样的事情。从cmd(powershell somethingsomething || echo %errorlevel%) 亲自尝试。我也不明白为什么解析器不起作用。脚本由 CI 放在那里,但肯定您确定脚本的内容吗?否则你的问题更多是关于如何让你的 CI 不输出无效的脚本......
标签: powershell windows-7 powershell-3.0