優れたPowerShellスクリプトの重要な部分の一つは、エラー処理です。 最短のスクリプトであっても、エラーを処理できることは、予期しないイベントが作業しているシステムを破壊しないようにするのに役立ちます。 以下の例を見てください。 弊社のサンプル会社で毎週(MyCompany.Com)人事は、経費データベースへのアクセス権を持っている必要があります私たちに伝えるリストをアッ, HRのリストに名前がない場合、グループから名前を削除し、そのユーザーは経費請求をログに記録できなくなります。
これで、これがどこで間違っているかを確認できます。 一週間HRがリストをアップロードしないか、リストにアクセスしようとしているのと同じように、ファイルサーバーが死ぬ。 突然PowerShellがGet-Contentコマンドレットでエラーをスローし、$AuthorizedUser変数は空のままです。 私たちのスクリプトはエラーを処理しないため、実行が継続され、非常に短い時間ですべてのユーザーがexpensesグループから削除されました。, かなりすぐに怒っている電話の呼び出しで洪水を開始し、人生は少し少ない幸せを取得します。 これをすべて回避する方法は、エラーをキャッチし、それらを引き起こしたイベントを処理することです(この場合、スクリプトを停止し、HRの誰かに叫
終了エラーと非終了エラー
エラーをキャッチするときに知っておくべき重要なことの一つは、デフォルトで特定のエラーのみをキャッチできる エラーには、終端と終端の二つのタイプがあります。 終了エラーは、関数または操作を停止するエラーです。, 構文エラーが発生したり、メモリが不足したりすると、終了エラーになります。 終了エラーをキャッチして処理できます。 非終端の誤差を許可ユー継続し、通常からcmdletsまたはその他の管理されます。 通常の状況下では、Try-Catch-Finallyによって捕まえることはできません。 上記の例のGet-Contentエラーは、非終了時のエラーです。
非終端エラーを終了として扱う
それでは、どのように非終端エラーをキャッチしますか? 基本的には、PowerShellに終了として扱うように指示します。 これを行うには、ErrorActionパラメーターを使用します。, 毎ユー cmdlet支ErrorAction. コマンドレットの最後に-ErrorAction Stopを指定すると、スローされたエラーがすべて終了として扱われ、キャッチできるようになります。 上記の例では、Get-Content行を次のように変更します。
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
すべてのエラーを終了として扱う
ErrorActionPreference変数を使用してすべてのエラーを終了として扱うこともできます。 これは、作業しているスクリプトまたはPowerShellセッション全体のいずれかで行うことができます。 スクリプトで設定するには、最初の行を$ErrorActionPreference=Stopにします。, セッションに設定するには、PowerShellコンソールで$ErrorActionPreference=Stopと入力します。
終了エラーのキャッチ
キャッチしようとしているエラーが終了として扱われることを確認したら、エラーを引き起こす可能性のあるコマンド(またはコマンド)の周りにTry Catchブロックを構築できます。 最初の段階は、Tryブロックでエラーをスローする可能性のあるスクリプトのセクションを囲むことです。 この例では、Get-Content行は次のようになります。
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
Tryブロックの直後に、エラーを処理するためにCatchブロックを配置する必要があります。, Catchブロックは、終了エラーが発生した場合にのみアクセスされ、それ以外の場合は無視されます。 この例では、エラーが発生したことを管理者にメールしてから、スクリプトを停止します。 Get-Content行は次のようになりました。
エラーレコードへのアクセス
catchブロック内に入ると、現在のオブジェクト変数$_に格納されているエラーレコードにアクセスできます。 エラーレコードにはさまざまな有用な特性がありますが、アクセスする主なものは$_です。例外だ, 例外は、エラーを引き起こした予期しないイベントです(エラーレコード自体は実際にはPowerShellユーザーに例外を提示するためのラッパーに過ぎません)。 それは私たちがキャッチしている例外であり、問題に関するすべての本当に有用な情報を含む例外です。 例外を引き起こしたさらなる根本的な問題があった場合、それは$_にも記録されます。例外だinnerexception(など–次の基礎となる例外は$_に格納されます。例外だインナーレキセプション。,インナーレッスンなど). この例の目的のために、$_を使用します。$_を使用して、通知メールにいくつかの追加情報を入れる例外。例外だメッセージと$_。例外だItemName properties:
特定の例外をキャッチする
この例では、ファイルの読み取り中に発生したエラーをキャッチし、それらすべてを同じ方法で処理しています。 ただし、特定の例外をキャッチしてそれらを異なる方法で処理することはできますが、元のエラーが終了している場合にのみ、それは大きなことです。, Get-Contentコマンドレットは終了しないエラーをスローするため(ErrorActionを使用して終了としてのみ処理した)、コマンドレットがスローする可能性のあるさまざまな これはPowerShellの機能であり、ErrorActionPreferenceに関係なく、終了しないエラーに適用され、変更することはできません。 それでも、読み取り操作中にトリミングされる可能性のあるメモリ不足エラーなど、他の終了例外に対処することができます。 この例の目的のために、それが私たちが行うことです。,
Catchキーワードの直後に例外名を指定することによって、特定の終了エラーをキャッチします。 この例では、システムをキャッチします。OutOfMemory例外と、我々はいずれかを取得した場合、すぐにコンピュータを再起動するナンセンスなアプローチを取るでしょう。 他のすべての例外をキャッチするために、ファイルが見つからないブロックの後に一般的なcatchブロックを含めます。
最後に、Finallyを使用して
Try Catch Finallyの最後の部分はFinallyブロックです。 これはCatchブロックの直後に定義する必要があり、エラーが発生したかどうかにかかわらず、毎回実行されます。, このようにして、操作が成功するか失敗するかにかかわらず、実行する必要のあるアクションを実行できます。 この例では、ファイルの読み取りが試行されたことをログに記録します。 私たちのGet-Content行は次のようになりました: