PowerShellを使用する方法最後にキャッチしてエラーを処理する

2021年7月15日 10258 ビュー PowerShellに関するその他の重要な情報試してみてください

PowerShell キャッチしてみてください ブロックは、PowerShellスクリプトのエラーを処理するために使用されます。 PowerShellを使用する場合 キャッチしてみてください スクリプトのブロックでは、次のことを実現できます。





  1. エラーが発生してもスクリプトを実行し続ける
  2. エラーメッセージの表示と処理を改善

このガイドでは、Powershellの使用方法を学習します キャッチしてみてください PowerShellで終了エラーメッセージを処理するためのブロック。さらに、含める方法を学習します ついに でブロック キャッチしてみてください ブロック。



ガイドは、の構文から始まります キャッチしてみてください ブロック。

投稿トピックを閲覧する



パワーシェル キャッチしてみてください 構文

PowerShell TryCatch構文

PowerShellの構文 キャッチしてみてください は…



try {}

The 試す PowerShellでエラーを監視するブロックの一部です。これは、終了エラーを返す可能性のある元のスクリプトを含むブロックです。

Tryブロックでエラーが発生すると、PowerShellはエラーを$ Error自動変数に保存します(これについては後で詳しく説明します)。



一方、t キャッチ PowerShellのステートメント キャッチしてみてください ブロックは、tryブロックで生成されたエラーを処理します。内で処理されるエラーのタイプを指定することもできます キャッチ ステートメントブロック。



The ついに ブロックは、スクリプトで不要になったリソースを解放するために使用できます。

PowerShellでの一般的な種類の例外エラー キャッチしてみてください

PowerShellのエラーの種類Catchを試してください

PowerShell TryCatchブロックでさまざまな種類のエラーを処理できます。たとえば、特定のエラーを処理できます。

さらに、一般的なエラーメッセージを処理できます。ただし、特定の種類のエラーを処理するには、エラーの種類を知る必要があります。

このガイドの後半で、エラーメッセージが$ error自動変数に保存されることを学びます。さらに、エラーは$ _パイプライン変数にも保存される場合があります。

さらに、$ error自動変数に保存されたエラーは配列に保存されます。これを説明するために、終了エラーメッセージを返すコマンドを実行してみましょう。

以前に保存されたすべてのエラーをクリアするには $ error 自動変数、以下のコマンドを実行する前に、まず、 $ error.Clear() 指図。 catch [[][',' ]*] {} Systerrと呼ばれるイベントログがないため、Tryブロックのコマンドはエラーメッセージをスローします。

驚いたことに、コマンドはエラーメッセージを表示しませんでした。では、エラーメッセージはどうなりましたか?

$ error自動変数に保存されます! $ error変数に保存されている最後のコマンドのエラーを表示するには、次のコマンドを実行します…

finally {

コマンドの結果は、$ error自動変数に保存されたエラーの詳細を表示します。エラー情報には、というセクションがあります FullyQualifiedErrorId

この特定のエラーについては、 FullyQualifiedErrorId 2セットの情報があります– System.InvalidOperationExceptionMicrosoft.PowerShell.Commands.GetEventLogCommand

私たちが興味を持っている情報は System.InvalidOperationException 。これはあなたができるタイプのエラーです キャッチ PowerShellのTryCatchブロックで。

このPowerShell例外の名前を取得するには、次のコマンドを実行します。

try {}

そこにそれがある、 System.InvalidOperationException

次のいくつかのサブセクションでは、一般的なPowerShellのTry CatchExceptionエラーについて説明します。

PowerShell TryCatch CommandNotFoundException エラー

PowerShellまたはMicrosoftコマンドプロンプトに存在しないコマンドを実行すると、エラーメッセージが表示されます。たとえば、 Get-File コマンドを実行すると、このコマンドは有効なPowerShellコマンドレットではないため、エラーメッセージが表示されます。

これは、PowerShellでのコマンドの結果のスクリーンショットです…

PowerShell Try CatchCommandNotFoundExceptionエラー

スクリーンショットからわかるように、例外のタイプ(FullyQualifiedErrorId)は次のとおりです。 CommandNotFoundException

これは終了エラーであるため、スクリプトの続行が停止します。このエラーがスクリプトを終了しないようにするには、コマンドを キャッチしてみてください ブロック。

このエラーをPowerShellTry Catchブロックでラップすると、PowerShellはエラーを抑制します。さらに、スクリプトの終了を停止します。

ただし、エラーが抑制されていても、$ error変数に保存されます。いつものように、以下のコマンドを実行する前に、まず$ error変数に保存されているエラーをクリアしてください。

catch [[][',' ]*] {}

PowerShell ISEではなくPowerShellでコマンドを実行する場合は、以下に示すように、コマンドを1行で入力します。

エラー#134(0x85100086)致命的な状態
finally {

次に、エラーを表示するには、…を実行します。

try {}

このセクションの主な紹介で述べたように、このエラーの例外IDを表示するには、次のコマンドを実行します。

catch [[][',' ]*] {}

例外のフルネームは System.Management.Automation.CommandNotFoundException

PowerShell TryCatch ManagementObjectNotFoundException エラー

間違った情報を使用してリモートPSセッションでコマンドを実行すると、PowerShellは ManagementObjectNotFoundException エラー。

典型的なシナリオは、PowerShellを使用してOffice365に接続する場合です。次に、Get-Userコマンドを実行しますが、間違ったユーザーを指定します 身元

PowerShell Try CatchManagementObjectNotFoundExceptionエラー

PowerShell Try Catchでこのエラーをキャッチするには、次のようなコマンドを使用します。

finally {キャッチ ManagementObjectNotFoundException PowerShell Tryのエラー、Catchは特に注意が必要です。あなたは使用する必要があります ErrorAction パラメータと指定 やめる 。それ以外の場合は、Try、Catchを使用しても、エラーが表示されます。

最後に、例外の名前を取得するには、次のコマンドを使用します。

|_+_|  
|_+_|
|_+_|

このコマンドは、例外のタイプを次のように返します。 System.Management.Automation.RemoteException 。だから、何ですか ManagementObjectNotFoundException

ManagementObjectNotFoundException 以下のコマンドで確認された例外の理由は次のとおりです。

Try { Get-EventLog -LogName Systerr } Catch { }

PowerShell TryCatch UnauthorizedAccessException エラー

もう1つの一般的なPowerShell例外エラーは UnauthorizedAccessException 。このタイプのエラーは、少なくとも読み取り権限がないアイテムにアクセスしようとするとスローされます。

この例を説明するために、認証されたユーザーが自分のコンピューター上の特定のファイルにアクセスすることを拒否しました。

PowerShell Try CatchUnauthorizedAccessExceptionエラー

ここで、Get-Contentコマンドを使用してファイルにアクセスしようとすると、アクセス拒否のメッセージが表示されます。

$error

このエラーの表示を停止するには、次のようにPowerShell TryCatchブロック内でコマンドを実行します…

$error[0].exception.gettype().fullname 

残念ながら、上記のコマンドはエラーの表示を停止しません。その理由は、それが終了エラーではないからです。

エラーの表示を停止するには、 ErrorAction パラメータと指定 やめる

$error.Clear() Try { Get-File } Catch { }

これで、コマンドはエラーを抑制します。例外の種類を表示するには、以下のコマンドを実行します…

$error.Clear(); Try {Get-File } Catch { }

例外の種類は次のとおりです。 System.UnauthorizedAccessException

このセクションで説明されているものよりも多くの種類の例外エラーがあります。最も一般的なタイプの例外についてのみ説明しました。

PowerShellで特定の例外をキャプチャする方法Catchを試してください

PowerShellで特定の例外をキャプチャする方法Catchを試してください

最後のセクションでは、一般的なPowerShellの例外と、例外の種類を見つける方法について説明しました。このセクションでは、その情報を使用して特定のタイプのエラーメッセージをキャプチャする方法について説明します。

このガイドの構文セクションで、PowerShell Try CatchFinallyの一般的な構文は…

$error

構文のcatchブロックで、[エラータイプ]を確認できます。ここで、このブロックでキャッチするエラーのタイプを指定します。

たとえば、UnauthorizedAccessExceptionエラーをキャッチするには、次のステートメントを使用します…

$error[0].exception.gettype().fullname 

PowerShellでコマンドを実行するには、ステートメントを1行で指定します。ステートメントの最初の部分である$ error.Clear()は、$ error変数に保存されているエラーをすべてクリアします。

$error.Clear(); Try {Get-User -Identity paul -ErrorAction Stop} Catch {}

複数を追加する方法 キャッチ PowerShellのブロック キャッチしてみてください 声明

このセクションの紹介では、特定のタイプの例外をキャッチする方法を示しました。 キャッチ ブロック。複数指定できます

ここに例があります…

$error[0].exception.gettype().fullname 

この例では、最初の キャッチ ブロックは、指定されたタイプの例外を処理します。また、2番目 キャッチ ブロックハンドルは一般的なエラーを処理します。

PowerShellでエラー例外を抽出する方法Catchを試してください

最後のサブセクションでは、さまざまなタイプの例外を処理するために複数のcatchブロックを指定する方法について説明しました。このサブセクションでは、例外でエラーの詳細を抽出する方法を学習します。

これを説明するために、前に使用した例を使用します。このPowerShellステートメントをPowerShellで実行します。

($error.CategoryInfo).Reason

$ errorを単独で実行します…

Get-Content D:PS-Tutorialfolder-names.txt

$ error変数には複数の情報が保存されていますが、実際のエラーメッセージは下のスクリーンショットで強調表示されています。

PowerShellでエラーの詳細を抽出する方法Catchを試してください

このエラーをテキストファイルに記録する場合は、実際のエラーの詳細を記録するだけで済みます。このエラーを抽出するには、次のコマンドを使用します。

$error.Clear(); Try {Get-Content D:PS-Tutorialfolder-names.txt} Catch {}

このコマンドは、実際のエラーメッセージを抽出します。パス「D: PS-Tutorial folder-names.txt」へのアクセスは拒否されました。

このエラーメッセージをログファイルに書き込むには、 アウトファイル Catchブロックのコマンド。

$error.Clear(); Try {Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction  Stop  } Catch {}
私は含めました 追加する のパラメータ アウトファイル 以前のエントリを上書きせずに複数のエントリのログを許可するコマンド。

最後のコマンドをわかりやすくするために、以下のスクリプト形式で書き直します…

$error[0].exception.gettype().fullname

含める方法 ついに PowerShellへのブロック キャッチしてみてください 声明

PowerShellのTryCatchステートメントにFinallyブロックを含める方法

含めることができます ついに PowerShellへのブロック キャッチしてみてください 声明。構文は

|_+_|  
|_+_|
|_+_|

The ついに ブロックは、スクリプトで不要になったリソースを解放するために使用できます。

CTRL + Cを使用してスクリプトを停止した場合でも、Finallyブロックが実行されます。 ExitキーワードがCatchブロック内からスクリプトを停止した場合にも、ブロックは実行されます。

最後の例では、エラーログをテキストファイルに書き込むステートメントがありました。 キャッチ ブロック。ただし、そのステートメントを使用するのに最適な場所は、 ついに ブロック。

以下の変更されたスクリプトを参照してください…

Try { Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction  Stop  } Catch [System.UnauthorizedAccessException] { }

PowerShellに関するその他の役立つ情報TryCatch

PowerShellに関するその他の重要な情報試してみてください

このセクションでは、PowerShell TryCatchに関する簡単で役立つ情報をいくつか紹介します。

PowerShellをクリアする方法$ Error自動変数をキャッチしてみてください

$ error自動変数には クリア 方法。このメソッドを使用して、$ error自動変数に保存されているすべてのエラーをクリアできます。

現在のPowerShellセッションの$ error自動変数に保存されているすべてのエラーをクリアするには、次のコマンドを実行します。

$error.Clear(); Try {Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction  Stop  } Catch [System.UnauthorizedAccessException] {}

PowerShellでカスタムエラーメッセージを表示する方法CatchBlockを試してください

PowerShell Try Catch Blockでカスタムエラーメッセージを表示するには、Throwワードを使用します。ここに例があります…

try { Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction  Stop  } Get-EventLog -LogName Systerr } Catch [  System.UnauthorizedAccessException  ], [  System.InvalidOperationException  ] { } Catch { } 

これは、PowerShellISEでのこのスクリプトの結果です。

PowerShellでカスタムエラーメッセージを表示する方法CatchBlockを試してください

PowerShellでエラーCategoryInfo情報を取得する方法Catchを試してください

$ error自動変数には、CategoryInfoというプロパティがあります。このプロパティと他のプロパティおよびメソッドを表示するには、以下のコマンドを実行します…

Excelで2行を切り替えます
$error.Clear(); Try {Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction Stop } Catch {}

最後のコマンドによって返されるプロパティの1つが呼び出されます CategoryInfo

この情報にアクセスするには、以下のコマンドを実行します。

$error

このコマンドは、複数のサブプロパティを返します。

PowerShellでエラーCategoryInfo情報を取得する方法Catchを試してください

これらの各サブプロパティには、ピリオドの後にサブプロパティ名を追加することでアクセスできます。たとえば、Reasonサブプロパティを表示するには、次のコマンドを実行します。

$error.Exception

Write-Hostを使用してPowerShellでエラーメッセージを表示する方法Catchを試してください

前のサブセクションのCategoryInfoプロパティと同様に、$ error自動変数にも次のプロパティがあります。 例外 。エラーで例外を表示するには、次のコマンドを実行します。

$error.Clear(); Try {Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction Stop } Catch Out-File D:PS-Tutorialerrorlogs.txt -Append

残念ながら、Write-Hostコマンドを使用してこの情報を表示しようとすると、期待どおりに機能しません。

$error.Clear() Try { Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction Stop } Catch $error.Exception 

これがPowerShellでのこのコマンドの結果です…

Write-Hostを使用してPowerShellでエラーメッセージを表示する方法Catchを試してください

ご覧のとおり、このコマンドは他の多くの情報を表示します。良いニュースは $ error.Exception と呼ばれる別のプロパティがあります メッセージ

このサブプロパティをに追加することで呼び出すことができます $ error.Exception 、 このような…

|_+_|  
|_+_|
|_+_|

さらに、あなたは使用することができます 書き込みホスト このエラー情報を表示するコマンド…

$error.Clear() Try { Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction Stop } Catch { } Finally $error.Exception 

最後のコマンドで実際のエラーメッセージが表示されます…

使用する特定の理由があることを除いて 書き込みホスト 最後のコマンドに示されているように、同じエラーメッセージを次のように表示するだけです。 $ error.Exception 指図。

PowerShellでハッシュテーブルを作成する方法Catchブロックを試す

を作成する一般的な方法は2つあります PowerShellハッシュテーブル TryCatchブロックで。

  1. Tryブロック内に複数のキーと値のペアを含むハッシュテーブルを作成できます
  2. または、次のコマンドを使用して単一のキー/値ハッシュテーブルを作成することもできます。 Catcをお試しください hブロックと内の値 Catcをお試しください hブロック。

これが最初の方法の例です…

$error.Clear()

ご覧のとおり、速攻は Catcをお試しください hブロック…

一方、値が内で定義された単一のハッシュテーブルキーを作成できます。 Catcをお試しください hブロック。ここに例があります…

try { Get-Content D:PS-Tutorialfolder-names.txt -ErrorAction Stop } catch {  Throw   'This is a custom error message' }

最後のスクリプトがPowerShellハッシュテーブルを生成することを確認するために、スクリプトを実行した後、$ hashtable変数に保存されている値を呼び出しました。

最後のコマンドの結果からわかるように、名前と値のペアがあります。

PowerShellのキャッチ例を試す

PowerShellのキャッチ例を試す

この最後のセクションでは、PowerShell TryCatchのアプリケーションの複数の例について説明します。

PowerShellの使用方法 キャッチしてみてください Get-Childitemを使用

Get-Childitemコマンドは、複数のエラーを返す可能性があります。 2つの一般的なエラーを説明するために、以下の2つのコマンドを使用します。

$error | Get-Member

最後のコマンドで使用されたテキストファイルへの正しいパスは、D: PS-Tutorial filelist.txtです。

ただし、最初のコマンドでは、D: PS-Tutorialの後にスペースを含めました。これによりエラーが発生しました(エラーの詳細はまもなく確認します)。

また、2番目のコマンドで、正しいパスを指定しましたが、間違ったファイル名を使用しました。これによりエラーが発生しました。

$error.CategoryInfo
PowerShellの使用方法Get-Childitemでキャッチしてみてください

次に、これらのエラーの詳細を取得するために、PowerShellでコマンドを実行します キャッチしてみてください ブロック。

$error.CategoryInfo.Reason

最初のタスクは、コマンドによって返されるエラーの種類を判別することです。この情報を取得するには、以下のコマンドを実行します…

$error.Exception

コマンドの結果は次のとおりです…

PowerShellを使用する方法Catchを使用して、Export-csvを使用してGet-WMIObjectエラーをエクスポートする$ error自動変数に保存されたエラーは、PowerShell配列に保存されます。配列内の各オブジェクトには、配列の最後に[0]、[1]を追加することでアクセスします。 0は配列の最初の項目を表し、1は2番目の項目を表します。

によってスローされたエラーに関する詳細情報の取得に戻る Get-Childitem コマンドでは、エラータイプに基づいて、Try Catchブロックを変更して、これら2つのタイプのエラーをキャプチャできます…

Write-Host $error.Exception

2番目のタスクは、実際のエラーメッセージを表示することです。このコマンドは次の仕事をします:

$error.Exception.Message

このコマンドは、2つのエラーメッセージを表示します…

PowerShellの使用方法 キャッチしてみてください Export-csvを使用してGet-WMIObjectエラーをエクスポートするには

このサブセクションでは、実行時に生成されたエラーをエクスポートします Get-WMIObject リモートコンピュータでCSVファイルに エクスポート-csv 指図。

まず、オフラインのリモートコンピュータに接続しようとしたときに生成されるエラーの詳細を見てみましょう。 Get-WMIObject 。これを説明するために、以下のコマンドを実行します…

Write-Host $error.Exception.Message

コマンドがエラーメッセージを生成したのは、 コンピューター は有効なPC名ではありません。

PowerShellでGet-Processエラーをキャッチする方法TryCatchステートメント

次に、エラーを管理するために、 試す のブロック キャッチしてみてください 声明。

Try { $hashtable = @{ Name = 'Document' PSProvider = 'FileSystem' Root = 'C:UsersvictoDocuments' }#end of hastable } Catch { }#end of Try Catch block 

の最初の行で 試す ブロック、$ ComputerName変数を定義しました。次に、2行目で、 Get-WmiObject 指図。

さらに、 キャッチ ブロック、エラーの詳細を作成し、CSVファイルにエクスポートしました エクスポート-csv

Windows用のtelnetをダウンロード

これは、スクリプトの詳細な説明です。 試す ブロック:

  1. 1行目で、CSVファイルを保存する場所を指定する$ path変数を作成しました
  2. 次に、2行目でGet-Dateコマンドを使用して、CSVファイルのファイル名を作成しました。ファイル名は次の形式です。 yyyyMMdd_HHmmss.csv
  3. 3行目では、$ dataという変数に保存された空のオブジェクトを作成しました
  4. 次に、4行目で、3行目で作成したオブジェクトに「ComputerName」列を追加しました。この列は$ ComputerName変数を取ります
  5. 5行目に、エラーメッセージを保存する「エラーメッセージ」ボリュームを追加しました。 $ error.Exception.Message
  6. 次に、6行目で、$ path変数と$ csvfilename変数を組み合わせてCSVファイルへのフルパスを作成する$ csvfilepath変数を作成しました。
  7. 最後に、7行目で、$ data変数($ ComputerNameおよび$ error.Exception.Message)に保存されている情報をパイプしました。 エクスポート-csv ファイルを$ csvfilepathに保存しました
The NoTypeInformation Export-csvコマンドのパラメーターは、タイプ情報を削除します。詳細については、ガイド「Powershell NoTypeInformation:アプリケーションと例」をお読みください。

以下のスクリーンショットは、スクリプトによって作成されたCSVを示しています…

PowerShellを使用してGet-Processエラーをキャッチする方法 キャッチしてみてください 声明

存在しないプロセスIDを使用してGet-Processコマンドを実行すると、 Microsoft.PowerShell.Commands.ProcessCommandException エラー。

この特定のタイプの例外をキャプチャするには、次のようなコマンドを実行します。

$hashtable = @{ 'File Name' = Try { (Get-ChildItem -Path D:PS-Tutorialfilelist.txt).Name } Catch { }#end of Try Catch block }#end of hastable

これは、PowerShellISEのスクリプトの結果です。

または、以下に示すようにスクリプトを変更して、カスタムエラーメッセージを定義することもできます…

Get-Childitem D:PS-Tutorial filelist.txt Get-Childitem D:PS-Tutorialfilelis.txt

これで、スクリプトはカスタムエラーメッセージを返します…

PowerShellを使用してGet-Mailboxエラーをキャッチする方法 キャッチしてみてください 声明

Office 365 PowerShellに接続して、 Get-Mailbox 存在しないユーザーに対しては、エラーメッセージが表示されます。一部のユーザーは、エラーメッセージのキャプチャに問題があると報告しています。 Get-Mailbox 指図。

このシナリオをテストするには、 Office365アカウント PowerShellを介して、以下のスクリプトを実行しました。

Get-Childitem D:PS-Tutorialfilelis.txt
ユーザーのPiusはOffice365アカウントに存在しません。

スクリプトがエラーメッセージを返しました オブジェクト「Pius」が「AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM」で見つからなかったため、操作を実行できませんでした '。

これがスクリーンショットです…

ただし、 キャッチしてみてください エラーをキャッチします。以下の変更されたコマンドに示すように、例外タイプを追加してみてください。

Try { Get-Childitem D:PS-Tutorial filelist.txt -ErrorAction SilentlyContinue Get-Childitem D:PS-Tutorialfilelis.txt -ErrorAction SilentlyContinue } Catch { }

それだけです–PowerShellに関する包括的で更新されたガイド キャッチファイナルをお試しください ly!お役に立てば幸いです。

役に立ったと思ったら、親切に投票してください はい この投稿は以下の役立つ質問でした。

または、このページの最後にある[返信を残す]フォームを使用して、質問したり、コメントを残したり、フィードバックを提供したりすることもできます。

最後に、PowerShell tech Sゾーンの詳細については、WindowsPowerShellハウツーガイドページにアクセスしてください。また、ホームページからの作業が非常に役立つ場合があります。

参考文献と参考資料

  1. 最後にキャッチを試すについて
  2. トラップについて
  3. PowerShellアレイとアレイへの追加:アプリケーションと例
  4. Powershell Forループの説明:構文と例