PowerShellには、スクリプトのデバッグを行うために、Set-PSDebugというコマンドレットがあります。
書式は大きく2つに分けることができ
Set-PSDebug [-Trace 数値] [-Step] [-Strict]
Set-PSDebug -Off
です。[]がついている箇所は省略可能です。
-Traceパラメータ
-Traceパラメータに指定できる値には下記の3つがあります。
| 値 |
説明 |
| 0 |
スクリプトのトレースを無効にする |
| 1 |
実行されるスクリプト行をトレースする |
| 2 |
スクリプト行、変数の代入、関数呼び出し、およびスクリプトをトレースする |
では、前回のスクリプトファイル(Debug.ps1)を使用して実験してみましょう。
$a = 2
$b = 3
$c = $a + $b
Write-Debug "Line4: $c"
$a = 4
$b = 5
$c = $a + $b
Write-Debug "Line8: $c"
-Traceに0を指定した場合
まずはSet-PSDebugコマンドレットによるスクリプトファイルのデバッグ方法ですが
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"を指定すれば良いことがわかります。
うまく使い分けて、デバッグに活用してみてください。