2
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 はシステムに存在しません)。

*例外は正常にキャッチされました

※テキスト「インサイドキャッチ」「アウトサイドキャッチ」を印字

#

Test() を 2 回目に呼び出し$cmd = "Get-Content "C:\Users\Administrator\Desktop\PS\lib\11.txt""ます (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

質問:

2番目の例外をキャッチしたい。コードのエラーを特定できません。

ありがとう

じゅがり

4

1 に答える 1

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です。

于 2013-09-02T14:01:04.090 に答える