SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Windows PowerShell 入門

Windows PowerShell 入門(10)-デバッグ編

デバッグ処理

  • X ポスト
  • このエントリーをはてなブックマークに追加

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 

次のページ
ブレークポイントを使用する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Windows PowerShell 入門連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3067 2008/10/15 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング