Set-PSDebugコマンドレットによるデバッグ
PowerShellには、スクリプトのデバッグを行うために、Set-PSDebug
というコマンドレットがあります。書式は大きく2つに分けることができます。
下記は、スクリプトのデバッグ機能の切り替え、トレース レベルの設定、および strict モードの切り替えを行います。
Set-PSDebug [-Trace 数値] [-Step] [-Strict]
一方、こちらはすべてのスクリプトデバッグ機能を無効にします。
Set-PSDebug -Off
-Traceパラメータ
-Traceパラメータに指定できる値には下記の3つがあります。
値 | 説明 |
0 | スクリプトのトレースを無効にする |
1 | 実行されるスクリプト行をトレースする |
2 | スクリプト行、変数の代入、関数呼び出し、およびスクリプトをトレースする |
では、さきほどのスクリプトファイル(Debug.ps1)を使用して実験してみましょう。
-Traceに0を指定した場合
まずはSet-PSDebug
コマンドレットによるスクリプトファイルのデバッグ方法ですが
PS C:\Work> Set-PSDebug -trace 0; ./Debug.ps1
のようにします。
-Trace
パラメータに0を指定した場合の実行結果は下記の通りで、値0はトレースが無効となっているために1行だけ表示して終わっています。
デバッグ出力の行には、先頭に「デバッグ:」と表示されることに注意してください。
PS C:\Work> Set-PSDebug -trace 0; ./Debug.ps1 デバッグ: 1+ Set-PSDebug -trace 0; ./Debug.ps1
-Trace
に1を指定した場合は行トレースとなりますので、すべての行がデバッグ表示されます。
-Traceに1を指定した場合
PS C:\Work> Set-PSDebug -trace 1; ./Debug.ps1 デバッグ: 1+ Set-PSDebug -trace 1; ./Debug.ps1 デバッグ: 1+ $a = 2 デバッグ: 2+ $b = 3 デバッグ: 3+ $c = $a + $b デバッグ: 4+ Write-Debug "Line4: $c" デバッグ: 5+ $a = 4 デバッグ: 6+ $b = 5 デバッグ: 7+ $c = $a + $b デバッグ: 8+ Write-Debug "Line8: $c"
-Traceに2を指定した場合
-Traceに2を指定した場合は変数の代入、関数呼び出しなど、各行で行われている詳細情報を見ることができます。
PS C:\Work> Set-PSDebug -trace 2; ./Debug.ps1 デバッグ: 1+ Set-PSDebug -trace 2; ./Debug.ps1 デバッグ: ! CALL script 'Debug.ps1' デバッグ: 1+ $a = 2 デバッグ: ! SET $a = '2'. デバッグ: 2+ $b = 3 デバッグ: ! SET $b = '3'. デバッグ: 3+ $c = $a + $b デバッグ: ! SET $c = '5'. デバッグ: 4+ Write-Debug "Line4: $c" デバッグ: 5+ $a = 4 デバッグ: ! SET $a = '4'. デバッグ: 6+ $b = 5 デバッグ: ! SET $b = '5'. デバッグ: 7+ $c = $a + $b デバッグ: ! SET $c = '9'. デバッグ: 8+ Write-Debug "Line8: $c"
上記を見るとわかるように、一番最初にスクリプトファイルの実行を行っているので
! CALL script 'Debug.ps1'
と表示されています。
また、変数に値がセットされるときは
SET $a = '2'.
のように表示されていることが分かります。
上記をまとめると-Trace
は、どの行を通って来たかを確認するだけであれば「1」を、詳細情報(変数にセットされた情報、関数呼び出しなど)を得たい場合には「2」を指定すれば良いことが分かります。
未定義の変数を調査する
Set-PSDebug
にパラメータ-Strict
を指定することで、未定義の変数をエラーとして処理することができます。
下記のように、Set-PSDebugコマンドレットを-Strictパラメータを指定して実行し、値の代入されていない変数を参照しようとするとエラーになることが分かります。
PS > Set-PSDebug -Strict PS > $a 変数 $a は、設定されていないために取得できません。 発生場所 行:1 文字:2 + $a <<<<
また、下記スクリプト(「C:\Work\Strict.ps1」として保存)を準備し
$a = 3 Write-Host ($a + $b)
コマンドラインから実行すると
PS C:\Work> ./Strict.ps1 変数 $b は、設定されていないために取得できません。 発生場所 C:\Work\Strict.ps1:2 文字:20 + Write-Host ($a + $b) <<<<
スクリプトファイル中の変数$b
が値が設定されていないのに使用されたことをエラーとして報告します。
このように、-Strictパラメータを使用することで、未定義の変数を見つけることが可能です。
ステップ実行する
Set-PSDebug
コマンドレットに-Stepパラメータを指定すると、ステップ実行を行うことが可能となります。「ステップ実行」は、スクリプトを1行ずつ停止させながら実行することができるモードです。
最初の方で紹介したDebug.ps1を用いて確認してみましょう。
コマンドラインで
PS C:\Work> Set-PSDebug -step; ./Debug.ps1
と入力して実行してみると、1行実行されるごとにメッセージが表示されます。
PS C:\Work> Set-PSDebug -step; ./Debug.ps1 この操作を続行しますか? 1+ Set-PSDebug -step; ./Debug.ps1 [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "Y"): デバッグ: 1+ Set-PSDebug -step; ./Debug.ps1
「規定値は"Y"」と表示されている箇所がありますが、これは[Enter]キーを押すと次の行が押されることを意味しており、[Y]キーを押すのと同操作となります。
次に[Enter]を2回続けて入力し
この操作を続行しますか? 2+ $b = 3 [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "Y"): s
というメッセージが表示されたところで[S]を入力します。
この状態で[S]を入力した場合には、処理が一時中断され、プロンプトの表示が
PS C:\Work>>>
に変わります。
ここで、プロントに下記のように$aと入力すると
PS C:\Work>>> $a 2
ステップ実行を行っている地点での変数の値を確認することができます(この場合は変数$a
に2が代入されていることが分かります)。
プロンプトを終了して、デバッグを再会する場合には exit と入力します。
PS C:\Work>>> exit