function Test($cmd)
{
Try
{
Invoke-Expression $cmd -ErrorAction Stop
}
Catch
{
Write-Host "Inside catch"
}
Write-Host "Outside catch"
}
$cmd = "vgc-monitors.exe" #Invalid EXE
Test $cmd
$cmd = "Get-Content `"C:\Users\Administrator\Desktop\PS\lib\11.txt`""
Test $cmd
#
第一次使用$ cmd =“vgc-monitors.exe”调用Test()(系统中不存在此exe文件)
*异常捕获
*文字“内部捕获”“外部捕获”打印
第二次使用$cmd = "Get-Content "C:\Users\Administrator\Desktop\PS\lib\11.txt""
调用Test()(11.txt在指定路径中不存在)
*异常未被抓住
*文字“内部捕获”未打印“
*获取以下错误消息
Get-Content : Cannot find path 'C:\Users\Administrator\Desktop\PS\lib\11.txt' because it does not exist.
At line:1 char:12
+ Get-Content <<<< "C:\Users\Administrator\Desktop\PS\lib\11.txt"
+ CategoryInfo : ObjectNotFound: (C:\Users\Admini...p\PS\lib\11.txt:String) [Get-Content], ItemNotFoundEx
ception
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
问题:
我希望抓住第二个例外。我无法弄清楚代码中的错误。
由于
Jugari
答案 0 :(得分:2)
您将-ErrorAction Stop
应用于Invoke-Expression
,执行得很好。要使错误操作指令适用于调用的表达式,您需要将其附加到$cmd
:
Invoke-Expression "$cmd -ErrorAction Stop"
或设置$ErrorActionPreference = "Stop"
:
$eap = $ErrorActionPreference
$ErrorActionPreference = "Stop"
try {
Invoke-Expression $cmd
} catch {
Write-Host "Inside catch"
}
$ErrorActionPreference = $eap
后者是更强大的方法,因为它不会对$cmd
进行假设。