Try-catch问题powershell

时间:2013-09-02 12:10:40

标签: powershell

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

1 个答案:

答案 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进行假设。