PowerShell のスクリプトを実行する上でデバッグを行う必要がある場合に役立つ情報を記載します。

1. デバッグ情報を出力する Write-Debug

Write-Debug コマンドレットを使用してデバッグ情報の出力を行えます。既定ではWrite-Debug コマンドレットを使用しても、自動変数 $debugPreference が "SilentlyContinue の場合は、デバッグ情報が出力されないので、$debugPreference = "Continue" に設定しています。

PS C:\> $debugPreference = "Continue"
__________________________________________________________________________________________
PS C:\> Write-Debug "デバッグ情報:$debugPreference"
デバッグ: デバッグ情報:Continue 
__________________________________________________________________________________________
PS C:\> $debugPreference = "SilentlyContinue"
__________________________________________________________________________________________
PS C:\> Write-Debug "デバッグ情報:$debugPreference"

$debugPreference は 次の値を指定できます。

設定値 説明
SilentlyContinue デバッグメッセージは表示されず、中断することなく実行する。
Continue デバッグメッセージを表示し、実行を継続する
Inquire デバッグメッセージを表示し、続行するかどうか確認する。
Stop デバッグメッセージを表示し、実行を停止する。エラーがコンソールに出力される。

$debugPreference など、PowerShell の動作をカスタマイズする変数の一覧は Get-Help about_preference_variables で確認できます。

コマンドレット単体に対して、-Debug オプションなどを指定してトレース情報、デバッグ情報の動作を指定できます。指定できるオプションの詳細はGet-Help about_commonparametersを確認して下し亜。

2. エラー警告情報をストリームに出力する

Write-Debug コマンドレットのほかに、 Write-Warning は警告、 Write-Error はエラーをエラーストリームに書き込みます。throw 文を使用して trap 可能な、停止するエラーを出力することができます。

エラーは $error 自動変数からアクセスできます。

3. 未定義変数参照時にエラーを出力する

PowerShell では、未定義変数を参照しても、エラーとなりません。が、たいていはバグが原因で未定義変数にアクセスしている場合がほとんどだと思います。Set-PsDebug コマンドレットをStrict オプションを指定して呼び出すことで、未定義変数を参照した場合にエラーをすることができます。

if (Test-Path Variable:\hello) { Remove-Item Variable:\hello }

Set-PsDebug -Off
Write-Host "非strict モードで実行"
$hello

Write-Host "strict モードで未定義変数アクセス"
Set-PSDebug -Strict
$hello

非strict モードで実行
strict モードで未定義変数アクセス
変数 '$hello' は、設定されていないために取得できません。
発生場所 行:9 文字:7
+ $hello <<<< 
    + CategoryInfo          : InvalidOperation: (hello:Token) []、RuntimeException
    + FullyQualifiedErrorId : VariableIsUndefined

特定のスコープでのみStrict モードを有効にする場合は、 Set-StrictMode コマンドレットも使用できます。

詳細は、Get-Help SetStrictMode を参照してください。

4. ブレークポイントを設定する

スクリプトの特定行に達したときにデバッグセッションに入りたい場合に、 $host.EnterNestedPrompt() を実行します。デバッグセッションでは、通常法PowerShell の構文を使用して実行中に変数情報や環境情報にアクセスできます。デバッグセッションを終了するには、 デバッグセッションのコンソールでexit コマンドを入力します。

# $host.EnterNestedPrompt()
 # でデバッグセッション
 Write-Debug "デバッグセッションに入ります"
 $x = 1
 $y = 2
 
 $host.EnterNestedPrompt()

5. まとめ

説明は以上です。 $host.EnterNestedPrompt() や Write-Debug などデバッグを行うのに便利な機能が実装されています。PowerShell ISE (Integrated Script Environment) を使用するとGUI を使用してブレークポイントの設定など行えるようになります。