none
PowerShellの例外処理について

    質問

  • お世話になっております。
    PowerShellのコマンドレットを発行し、例外が発生した場合にcatchブロックにて例外を拾おうとしているのですがうまくいきません。
    作成したスクリプトは下記になります。
    $LiveCred = Get-Credential
    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection
    Import-PSSession $Session
    try{
        #メンバ追加
        Add-DistributionGroupMember -Identity "New1" -Member "e-01"    
    }
    catch [Exception]{
        Write-Output "処理失敗"
        break
    }
    Finally  {
    Remove-PSSession $Session
    }
    実行すると以下のようにエラーが表示されます。
    受信者 "e-01" は既にグループ "New1" のメンバーです。
        + CategoryInfo          : NotSpecified: (e-01:RecipientWithAdUserGroupIdParameter`1) [Add-DistributionGroupMember]、MemberAlreadyExistsException
        + FullyQualifiedErrorId : F04C499,Microsoft.Exchange.Management.RecipientTasks.AddDistributionGroupMember
    例外をcatchできていれば「処理失敗」と表示されるはずなのですが、catch出来ていないようです。
    この例外を拾うためにはどのように記述すればよいのでしょうか?
    ご教示の程よろしくお願い致します。
    2011年9月27日 1:53

回答

  • コマンドレットが出した例外は、try...catchステートメントやtrapステートメントでは捕捉できません。

    その代り共通パラメータ-errorActionを使用すると、コマンドレットのエラー発生時の挙動を決めることができます。

    たとえば

    Add-DistributionGroupMember -Identity "New1" -Member "e-01"  -errorAction silentlyContinue

    のようにすると、エラーが発生してもエラーメッセージを出さずに処理が続行します。他のパラメータ値については

    get-help about_Commonparameters

    をご確認ください。デフォルトではerrorActionは"continue"です(エラーを表示するが処理は続行)。
    デフォルトの挙動はシェル変数$ErrorActionPreferenceで定義することができます。

    コマンドレットのエラー発生時に任意のエラー処理ルーチンを走らせることもできなくはないです。

    try
    {
        Get-Process -name 1 -erroraction stop
    }
    catch [System.Management.Automation.ActionPreferenceStopException]
    {
        if($_.exception -is [Microsoft.PowerShell.Commands.ProcessCommandException])
        {
                "プロセス名がみつからなかった"
        }
    }
    

    -errorActionをstopにするとエラー発生時に処理が止まるのですが、このとき発生する例外(ActionPreferenceStopException)はtry...catchで捕捉可能です。そしてコマンドレットで実際に発生した例外はcatch節内の$_.exceptionに格納されているので、この型によって例外処理を分けることができます。
    • 回答としてマーク siwashita 2011年9月27日 4:26
    2011年9月27日 2:55
    モデレータ

すべての返信

  • コマンドレットが出した例外は、try...catchステートメントやtrapステートメントでは捕捉できません。

    その代り共通パラメータ-errorActionを使用すると、コマンドレットのエラー発生時の挙動を決めることができます。

    たとえば

    Add-DistributionGroupMember -Identity "New1" -Member "e-01"  -errorAction silentlyContinue

    のようにすると、エラーが発生してもエラーメッセージを出さずに処理が続行します。他のパラメータ値については

    get-help about_Commonparameters

    をご確認ください。デフォルトではerrorActionは"continue"です(エラーを表示するが処理は続行)。
    デフォルトの挙動はシェル変数$ErrorActionPreferenceで定義することができます。

    コマンドレットのエラー発生時に任意のエラー処理ルーチンを走らせることもできなくはないです。

    try
    {
        Get-Process -name 1 -erroraction stop
    }
    catch [System.Management.Automation.ActionPreferenceStopException]
    {
        if($_.exception -is [Microsoft.PowerShell.Commands.ProcessCommandException])
        {
                "プロセス名がみつからなかった"
        }
    }
    

    -errorActionをstopにするとエラー発生時に処理が止まるのですが、このとき発生する例外(ActionPreferenceStopException)はtry...catchで捕捉可能です。そしてコマンドレットで実際に発生した例外はcatch節内の$_.exceptionに格納されているので、この型によって例外処理を分けることができます。
    • 回答としてマーク siwashita 2011年9月27日 4:26
    2011年9月27日 2:55
    モデレータ
  • コマンドレットの例外は補足出来ないのですね・・・

    ご教示の通り、ErrorActionを指定して対処することにしました。

     

    ご回答ありがとうございました。

    2011年9月27日 4:26