$?変数
この変数は、最後に実行したコマンドの実行状態を保持するブール変数です。直前の処理が成功した場合にはTrue、それ以外の場合はFalseとなります。
まずは、この変数の動きを見てみましょう。何もエラーが発生していない状態で、$?変数の中身を確認すると
PS C:\Work> $? True
上記のようにTrueを返します。
下記のようにエラー発生させ
PS C:\Work> Get-ChildItem HOGE Get-ChildItem : パス 'C:\Work\HOGE' が存在しないため検出できません。 発生場所 行:1 文字:14 + Get-ChildItem <<<< HOGE
$?の値を確認すると
PS C:\Work> $? False
上記のようにFalseを返します。
この$?変数は特にスクリプトの中で効果を発揮します。
下記はカレントディレクトリに「HOGE」が存在するかを確認していますが、存在しない場合にはエラーが発生します。しかし、2>&1演算子を利用してエラー内容を$err変数に書き込むので、エラーメッセージは表示されません。また、エラーが発生しても処理は続行します。
このような場合に$?を使用することで、直前のコマンドが成功したか否かを確認することが可能となります。
$err = Get-ChildItem HOGE 2>&1
if ($?) {"エラーは発生しませんでした" }
else {"エラーが発生しました"}
-ErrorActionパラメータと$ErrorActionPreference変数
PowerShellでは、エラーの表示方法を制御することが可能で
- コマンドレット使用時に発生したエラー
- すべてのエラー
それぞれに対して行うことができます。
コマンドレット使用時のエラー表示を制御するには-ErrorActionパラメータを、すべてのエラー表示の制御を行うには$ErrorActionPreference変数を設定します。
設定可能な値は共通です。それぞれについて見ていきます。
continue
デフォルトではcontinueになっています。エラーが発生した場合はメッセージが出力されます。
エラーの内容は$Error変数に追加され、$?変数はFalseとなります。スクリプトは次の行から実行されます。
silentlycontinue
エラーが発生してもメッセージは出力されません。
エラーの内容は$Error変数に追加され、$?変数はFalseとなります。スクリプトは次の行から実行されます。
stop
エラーが発生した時点で処理を中止します。
エラーの内容は$Error変数に追加され、$?変数はFalseとなります。スクリプトは停止します。
-ErrorActionパラメータの使用方法
このパラメータは、コマンドレット使用時に発生したエラーの表示を制御します。
-ErrorActionパラメータにcontinueを設定した場合は、エラーメッセージが出力されます。
PS C:\Work> Get-ChildItem Hoge -ErrorAction "continue" Get-ChildItem : パス 'C:\Work\Hoge' が存在しないため検出できません。 発生場所 行:1 文字:14 + Get-ChildItem <<<< Hoge -ErrorAction "continue"
-ErrorActionパラメータにsilentlycontinueを設定した場合は、エラーメッセージが出力されません。
PS C:\Work> Get-ChildItem Hoge -ErrorAction "silentlycontinue" PS C:\Work>
-ErrorActionパラメータにstopを設定した場合は、エラーアクション設定によって実行が中止されたことを示すメッセージが表示され、処理を中止します。
PS C:\Work> Get-ChildItem Hoge -ErrorAction "stop" Get-ChildItem : シェル変数 "ErrorActionPreference" が Stop に設定さ れているため、コマンドの実行が停止しました。 パス 'C:\Work\Hoge' が存在しないため検出できません。 発生場所 行:1 文字:14 + Get-ChildItem <<<< Hoge -ErrorAction "stop"
$ErrorActionPreference変数の使用方法
この変数に設定した値は、発生したエラーすべてのエラー表示を制御します。
$ErrorActionPreference変数への値の設定は、=演算子の左辺に$ErrorActionPreference変数を、右側に設定する値を記述します。
試しに$ErrorActionPreference変数へsilentlycontinueを設定してみます。
PS C:\Work> $ErrorActionPreference = "silentlycontinue"
この状態で、エラーが発生するコマンドを実行してみます。
PS C:\Work> Get-ChildItem Hoge PS C:\Work>
エラーメッセージは表示されません。
$ErrorActionPreference変数にsilentlycontinueを設定した効果が現れていることが分かります。(元に戻すには$ErrorActionPreference="Continue"と入力してください。)
