おはこんばんにちは、ビショップです。
以前からMicrosoft365関連の記事を紹介しています。今回もその関連話題です。Microsoft365のユーザ情報を取得してゴニョゴニョする仕組みを構築する必要があったので、PowerShellのスクリプトを組んでいました。そんな時に、エラーハンドリング部分で壁にブチ当たったので、まとめておきたいと思います。今回は、Get-MsolUserコマンドでまとめますが、他のMicrosoft365関連のコマンドレットでも応用が利くと思います。
下記サイトを参考にさせて頂きました。
All-in-one Get-User cmdlet: Part 2 – Error Handling Get-MsolUser:
All-in-one Get-User cmdlet: Part 2 – Error Handling Get-MsolUser – Milne.IT
今回のサンプルは、Get-MsolUsersコマンドでユーザが存在しなかった場合、存在しなかったユーザをログに書き込んで一覧にするようなプログラムです。それがやりたくて調べました。
このGet-MsolUserコマンドにおけるユーザが存在しなかったときのエラーは、エラーメッセージこそPowerShell上に赤文字で表示されるのですが、処理が中断されないエラーで、PowerShellのtry-catchでは捕らえることができません。なので、コマンド実行時にまずはErrorActionを指定して、エラーが発生した際に処理を中断させる必要があります。
今回、ユーザが存在しなかったことだけ分かればいいので、catchにはUserNotFoundExceptionを指定してエラー処理を絞り込んでいます。ダブルチェックの処理は、通常処理時に後続の処理が正しく実行されるように判定用変数にtrueをしっかり戻す処置です。catch内のthrowですが、For文の中でこのtry-catchを使っていた場合は、continueにしないと動かないかもしれないので、試してみてください。
try { # ユーザ情報の取得 -ErrorAction Stop でエラー時は処理を中断させる $MsolUser = Get-MsolUser -UserPrincipalName $UserPName -ErrorAction Stop # ダブルチェック if ($MsolUser) { $MsolUserFound = $true } else { $MsolUserFound = $false } if ($MsolUserFound) { "ユーザがちゃんといたときの処理" } else { "[Warning]User not found. User=[$UserPName]" >> hoge.txt } } catch [Microsoft.Online.Administration.Automation.UserNotFoundException] { # 発生したエラーメッセージの取得 $MsolUserError = $MsolUser.Exception.Message if ($MsolUserError -match "^User Not Found."){ # User Not Found が含まれていれば $MsolUserFound = $false } else { throw # For文内なら continue かも } }