我有几个PowerShell脚本文件。 a.ps1
'调用'(通过点运算符)b.ps1
和c.ps1
脚本。
a.ps1 #main
b.ps1 #helper1 <- need catch error there
c.ps1 #helper2 <- error is being raised there
在b.ps1
文件中是否可以捕获c.ps1
文件中引发的终止错误?
感谢。
修改
内部a.ps1
:
. .\b.ps1
. .\c.ps1
内部b.ps1
:
trap {
Write-Host "my trap block"
}
内部c.ps1
:
throw "test"
在此示例中未调用“我的陷阱块”
答案 0 :(得分:4)
您可以在trap
中安装b.ps1
处理程序,以处理c.ps1
中的错误(如果您点对源b.ps1
,以便它与{{1}在同一范围内运行例如:
a.ps1
更新:确实这不起作用。似乎PowerShell并不尊重通过点源采用a.ps1范围运行的概念。不确定你能做的比这更好:
. .\b.ps1
看起来陷阱处理程序需要在a.ps1中,但您可以在b.ps1中定义陷阱处理函数。不过,不要认为你可以控制这个函数中错误的处理(中断或继续)。
答案 1 :(得分:0)
这真的很奇怪。显然,陷阱并不关心范围。
我没有适当的解决方案,但我有一个狡猾的解决方法:
您可以在<:p>中编写 this
.([scriptblock]::create(( (gc .\b.ps1 -del `0) + "`n" + (gc .\c.ps1 -del `0) )))
或者同样的事情,换句话说:
.( [scriptblock]::create(( @(gc .\b.ps1) + @(gc .\c.ps1) -join "`n" )) )