PowerShell HelpFile - about_debuggers
 記事記号:[me1526] 初版:2011/May/10

この文書は、Windows PowerShellのヘルプ機能で表示される内容を再構成したものです。

トピック
    about_Debuggers

簡易説明
    Windows PowerShell デバッガーについて説明します。

詳細説明
    デバッグとは、スクリプトの命令にあるエラーを識別および修正するためにスクリプ
    トの実行中にスクリプトを検査するプロセスです。Windows PowerShell デバッガーは、
    スクリプト内のエラーおよび無効性の検査および識別を支援するように設計されてい
    ます。
  
    注: Windows PowerShell デバッガーはリモートでは実行されません。リモート コン
        ピューターでスクリプトをデバッグするには、スクリプトをローカル コンピュー
        ターにコピーします。

    Windows PowerShell デバッガーの機能を使用して、Windows PowerShell のスクリプト、
    関数、コマンド、または式を実行中に検査することができます。Windows PowerShell 
    デバッガーには、ブレークポイントの設定と管理、およびコール スタックの表示を行
    うことができる一連のコマンドレットが含まれています。
 
    Windows PowerShell には、スクリプト、関数、およびコマンドのデバッグに使用でき
    るいくつかの方法があります。

    方法 1: Set-PsDebug コマンドレットは、ステップ処理およびトレースを含む基本的
            なスクリプトのデバッグ機能を提供します。詳細については、次のように入
            力してヘルプを参照してください。"get-help set-psdebug".

    方法 2: Set-StrictMode コマンドレットを使用して、初期化されていない変数への参
            照、オブジェクトに存在しないプロパティへの参照、および無効な関数構文
            を検出します。

    方法 3: 変数の値を表示するステートメント、コマンド ラインからの入力を読み取
            るステートメント、または現在の命令を報告するステートメントなどの診断
            ステートメントをスクリプトに追加します。このタスクには、Write-Host、
            Write-Debug、Write-Warning、Write-Verbose などの動詞 Write を含むコ
            マンドレットを使用します。

    方法 4: Windows PowerShell デバッガーを使用して、スクリプトをデバッグします。
            または、デバッガーを使用して、コマンド プロンプトで入力した関数または
            スクリプト ブロックをデバッグします。ブレークポイントの設定、スクリプ
            トのステップ スルー、変数の値の確認、診断コマンドおよびログ コマンド
            の実行、およびコール スタックの表示が可能です。
    
  デバッガー コマンドレット
      Windows PowerShell デバッガーには、以下の一連のコマンドレットがあります。


          Set-PsBreakpoint:     行、変数、およびコマンドにブレークポイントを設定
                                します。

          Get-PsBreakpoint:     現在のセッションのブレークポイントを取得します。

          Disable-PsBreakpoint: 現在のセッションのブレークポイントを無効にします。

          Enable-PsBreakpoint:  現在のセッションのブレークポイントを再び有効にし
                                ます。

          Remove-PsBreakpoint:  現在のセッションからブレークポイントを削除します。

          Get-PsCallStack:      現在のコール スタックを表示します。


  デバッガーの開始および停止
      デバッガーを開始するには、1 つまたは複数のブレークポイントを設定します。そ
      の後、デバッグするスクリプト、コマンド、または関数を実行します。

      ブレークポイントに到達すると、実行が停止し、デバッガーに制御が渡されます。

      デバッガーを停止するには、スクリプト、コマンド、または関数を完了するまで実
      行します。または、「stop」または「t」と入力します。

  デバッガー コマンド
      Windows PowerShell コンソールでデバッガーを使用するときは、以下のコマンド
      を使用して実行を制御します。

      注: その他のホスト アプリケーションでデバッガーを使用する方法については、
          ホスト アプリケーションのドキュメントを参照してください。

 	s, Step-into        次のステートメントを実行してから停止します。

 	v, Step-over        次のステートメントを実行しますが、関数および呼び出し
 	                    をスキップします。スキップしたステートメントは実行さ
                            れますが、ステップ スルーされません。

 	o, Step-out         現在の関数からステップ アウトします。入れ子になって
                            いる場合、1 つ上のレベルにステップ アップします。本
                            文にある場合、最後または次のブレークポイントまで進
                            みます。スキップしたステートメントは実行されますが、
                            ステップ スルーされません。

 	c, Continue         スクリプトが完了するまで、または次のブレークポイント
                            に到達するまで続行します。スキップしたステートメント
                            は実行されますが、ステップ スルーされません。

        l, List             スクリプト内の、実行中の部分を表示します。既定では、
                            現在の行、前の 5 行、および次の 10 行を表示します。
                            スクリプトの一覧表示を続行するには、Enter キーを押
                            します。                        

        l , List          で指定された行番号で始まる 16 行のスクリプトを
                            表示します。                           

        l  , List      で指定された行番号で始まる  行のスクリプトを
                            表示します。
                                   
        q, Stop             スクリプトの実行を停止し、デバッガーを終了します。

        k, Get-PsCallStack  現在のコール スタックを表示します。

	             最後のコマンドが Step (s)、Step-over (v)、または Lis
                            t (l) だった場合は、そのコマンドを繰り返します。それ
                            以外の場合は、送信操作を表します。

	?, h                デバッガー コマンドのヘルプを表示します。

      デバッガーを終了するには、Stop (q) を使用します。

      デバッガーの実行中でも、コマンドの入力、変数の値の表示、コマンドレットの使
      用、およびスクリプトの実行が可能です。

      これらのデバッガー コマンドを使用することにより、スクリプトを実行し、問題の
      場所で停止し、変数の値およびシステムの状態を検査して、問題を特定するまでス
      クリプトの実行を続行することができます。

  デバッガー環境
      ブレークポイントに到達すると、デバッガー環境に入ります。コマンド プロンプト
      が、"[DBG]:" で始まるように変更されます。このプロンプトはカスタマイズするこ
      とができます。
     
      また、Windows PowerShell コンソールなど一部のホスト アプリケーション (ただ
      し Windows PowerShell Integrated Scripting Environment (ISE) を除く) では、
      入れ子になったプロンプトがデバッグ用に開きます。コマンド プロンプトに表示さ
      れる大なり文字 (ASCII 62) の繰り返しで、入れ子になったプロンプトを確認でき
      ます。

      たとえば、以下は Windows PowerShell コンソールの既定のデバッグ プロンプトで
      す。

          [DBG]: PS (get-location)>>>

      $NestedPromptLevel 自動変数を使用することによって入れ子のレベルを確認できま
      す。

      また、自動変数 $PSDebugContext は、ローカル スコープで定義されています。
      $PSDebugContext 変数の有無を利用すると、デバッガー内であるかどうかを判断で
      きます。

      次にその例を示します。
 
          if ($psdebugcontext) {"Debugging"} else {"Not Debugging"}

      デバッグ中に、$PSDebugContext 変数の値を使用できます。

	[DBG]: PS>>> $psdebugcontext.invocationinfo

       Name   CommandLineParameters  UnboundArguments  Location
        ----   ---------------------  ----------------  --------
        =      {}                     {}                C:\ps-test\vote.ps1 (1)

  デバッグおよびスコープ
      デバッガーに割り込んでも処理中のスコープは変更されませんが、スクリプトのブ
      レークポイントに到達すると、そのスクリプト スコープに移動します。スクリプト 
      スコープは、デバッガーを実行したスコープの子です。

      スクリプト スコープで定義される変数およびエイリアスを確認するには、Scope パ
      ラメーターの Get-Alias または Get-Variable コマンドレットを使用します。

      たとえば、次のコマンドはローカル (スクリプト) スコープの変数を取得します。

	  get-variable -scope 0

      このコマンドは次のように短縮することができます。

	gv -s 0

      この方法は、スクリプト内で定義した変数およびデバッグ中に定義した変数のみを
      確認するときに便利です。

  コマンド ラインでのデバッグ
      変数のブレークポイントまたはコマンドのブレークポイントを設定する場合、ブレ
      ークポイントはスクリプト ファイル内にのみ設定できます。ただし既定では、ブ
      レークポイントは現在のセッションで実行される任意のものに設定されます。

      たとえば、$name 変数にブレークポイントを設定した場合、ブレークポイントを無
      効にするか削除するまで、デバッガーでは、実行するスクリプト、コマンド、関数、
      スクリプトのコマンドレットまたは式の中にある任意の $name 変数で実行が中断
      されます。

      これによって、スクリプトをより実際的なコンテキストでデバッグできますが、そ
      のコンテキストでは、スクリプトはセッションにあるおよびユーザーのプロファイ
      ルにある関数、変数、およびその他のスクリプトによって影響を受ける可能性があ
      ります。

      行のブレークポイントは、スクリプト ファイルに固有のため、スクリプト ファイ
      ル内のみ設定されます。

  関数のデバッグ
      Begin、Process、および End セクションがある関数でブレークポイントを設定す
      ると、デバッガーは各セクションの最初の行で実行を中断します。

      次にその例を示します。

              function test-cmdlet
              {
                  begin
                  {
                      write-output "Begin"
                  }
                  process
                  {
                      write-output "Process"
                  }
                  end
                  {
                      write-output "End"
                  }
              }
        
          C:\PS> set-psbreakpoint -command test-cmdlet

          C:\PS> test-cmdlet
    
          Begin
          デバッグ モードを開始します。ヘルプを表示するには、h または ? を使用し
          てください。

          ヒット 'prompt:test-cmdlet' のコマンドのブレークポイント

          test-cmdlet

          [DBG]: C:\PS> c
          Process
          デバッグ モードを開始します。ヘルプを表示するには、h または ? を使用し
          てください。

          ヒット 'prompt:test-cmdlet' のコマンドのブレークポイント

          test-cmdlet

          [DBG]: C:\PS> c
          End
          デバッグ モードを開始します。ヘルプを表示するには、h または ? を使用し
          てください。

          ヒット 'prompt:test-cmdlet' のコマンドのブレークポイント

          test-cmdlet

          [DBG]: C:\PS>


  リモート スクリプトのデバッグ
      Windows PowerShell デバッガーはリモート セッションでは実行できません。リモ
      ート コンピューターでスクリプトをデバッグするには、スクリプトをローカル コ
      ンピューターにコピーします。

      次のコマンドは、Test.ps1 スクリプトを Server01 リモート コンピューターから
      ローカル コンピューターにコピーします。

          invoke-command -computername Server01 ` {get-content 
          c:\ps-test\test.ps1} | set-location c:\ps-test\test.ps1

  例
      このテスト スクリプトは、オペレーティング システムのバージョンを検出し、シ
      ステムに適したメッセージを表示します。関数、関数呼び出し、および変数が含ま
      れます。

      次のコマンドは、テスト スクリプト ファイルの内容を表示します。
	
	  c:>\PS-test> get-content test.ps1

          function psversion {
             "Windows Powershell " + $psversiontable.psversion
              if ($psversiontable.psversion.major -lt 2) {
                  "Upgrade to Windows PowerShell 2.0!"
              }
              else {
                  "Have you run a background job today (start-job)?"
              }
          }

	  $scriptname = $MyInvocation.MyCommand.Path
	  psversion
	  "Done $scriptname."

      起動するには、スクリプト内の行、コマンド、変数、関数などの目的の場所にブレ
      ークポイントを設定します。

      現在のディレクトリの Test.ps1 スクリプトの最初の行に、行のブレークポイント
      を作成することによって起動します。

          PS C:\ps-test> set-psbreakpoint -line 1 -script test.ps1

      このコマンドは次のように短縮することができます。

          PS C:\ps-test> spb 1 -s test.ps1
        
      このコマンドは、行のブレークポイント オブジェクト 
      (System.Management.Automation.LineBreakpoint) を返します。

  	    Column     : 0
            Line       : 1
            Action     :
            Enabled    : True
            HitCount   : 0
            Id         : 0
            Script     : C:\ps-test\test.ps1
            ScriptName : C:\ps-test\test.ps1
	
      ここで、スクリプトを起動します。

	  PS C:\ps-test> .\test.ps1

      スクリプトが最初のブレークポイントに到達すると、ブレークポイント メッセー
      ジによりデバッガーがアクティブであることが示されます。メッセージには、ブレ
      ークポイントの説明とスクリプトの最初の行にある関数宣言のプレビューが表示さ
      れます。また、デバッガーに制御があることを示すコマンド プロンプトに変更され
      ます。

      プレビュー行には、スクリプト名とプレビューしているコマンドの行番号が含まれ
      ます。

          デバッグ モードを開始します。ヘルプを表示するには、h または ? を使用し
          てください。

          ヒット 'C:\ps-test\test.ps1:1' の行のブレークポイント

          test.ps1:1  function psversion {
          DBG>

      Step コマンド (s) を使用してスクリプトの最初のステートメントを実行し、次の
      ステートメントをプレビューします。次のステートメントは、$MyInvocation 自動
      変数を使用して $ScriptName 変数の値をスクリプト ファイルのパスおよびファイ
      ル名に設定します。

          DBG> s
          test.ps1:11 $scriptname = $MyInvocation.MyCommand.Path

      この時点では $ScriptName 変数に値が設定されませんが、その値を表示すること
      で変数の値を確認することができます。この場合、値は $null です。

          DBG> $scriptname
          DBG>

      別の Step コマンド (s) を使用して現在のステートメントを実行し、スクリプト
      の次のステートメントをプレビューします。次のステートメントは、PsVersion 関
      数を呼び出します。

	  DBG> s
	  test.ps1:12 psversion

      この時点で $ScriptName 変数に値が設定されますが、その値を表示することで変
      数の値を確認することができます。この場合、値はスクリプトのパスに設定されま
      す。

          DBG> $scriptname
          C:\ps-test\test.ps1

      別の Step コマンドを使用して関数呼び出しを実行します。Enter キーを押すか、
      Step の「s」と入力します。

	  DBG> s
	  test.ps1:2       "Windows Powershell " + $psversiontable.psversion

      デバッグ メッセージには、関数にあるステートメントのプレビューが含まれます。
      このステートメントを実行し、関数にある次のステートメントをプレビューする場
      合、Step コマンドを使用することができます。ただし、ここでは Step-Out コマン
      ド (o) を使用します。関数の実行を完了し (ブレークポイントに到達した場合を除
      く)、スクリプトの次のステートメントに進みます。

	  DBG> o
	  Windows Powershell 2.0
	  Have you run a background job today (start-job)?
	  test.ps1:13 "Done $scriptname"

      スクリプトの最後のステートメントにいるため、Step、Step-Out、および Continu
      e コマンドの結果は同じになります。ここでは Step-Out コマンド (o) を使用しま
      す。

	  Done C:\ps-test\test.ps1
	  PS C:\ps-test>

      Step-Out コマンドは最後のコマンドを実行します。標準のコマンド プロンプトに
      よって、デバッガーが終了し、制御をコマンド プロセッサに返したことが示されま
      す。

      ここで、デバッガーを再び実行します。まず、現在のブレークポイントを削除する
      には、Get-PsBreakpoint および Remove-PsBreakpoint コマンドレットを使用しま
      す。
      (ブレークポイントの再利用を考えている場合は、Remove-PsBreakpoint コマンドレ
      ットではなく Disable-PsBreakpoint を使用します。)

	  PS C:\ps-test> Get-PsBreakpoint | Remove-PSBreakpoint

      このコマンドは次のように短縮することができます。

	  PS C:\ps-test> gbp | rbp

      または、次の関数ような関数を記述することによってコマンドを実行します。

	  function delbr { gbp | rbp }

      ここで、$scriptname 変数にブレークポイントを作成します。

	  PS C:\ps-test> set-psbreakpoint -variable scriptname -script test.ps1

      このコマンドは次のように短縮することができます。

	  PS C:\ps-test> sbp -v scriptname -s test.ps1

      ここで、スクリプトを起動します。スクリプトは、変数のブレークポイントに到達
      します。既定モードは Write なので、実行は変数の値を変更するステートメント
      の直前で停止します。

	  PS C:\ps-test> .\test.ps1
	  ヒット 'C:\ps-test\test.ps1:$scriptname' の変数のブレークポイント 
          (Write アクセス)

	  test.ps1:11 $scriptname = $MyInvocation.mycommand.path
	  DBG>

      $scriptname 変数の現在の値、$null を表示します。

          DBG> $scriptname
          DBG>

      Step コマンド (s) を使用して変数に値を設定するステートメントを実行します。
      その後、$scriptname 変数の新しい値を表示します。

	  DBG> $scriptname
	  C:\ps-test\test.ps1

      Step コマンド (s) を使用してスクリプトの次のステートメントをプレビューしま
      す。

	  DBG> s
	  test.ps1:12 psversion
   
      次のステートメントは、PsVersion 関数に対する呼び出しです。関数をスキップし
      ながらも実行するには、Step-Over コマンド (v) を使用します。Step-Over を使用
      する際に既に関数内に入っている場合、その関数は無効になります。関数呼び出し
      は表示されますが、実行されません。
	
	  DBG> v
	  Windows Powershell 2.0
	  Have you run a background job today (start-job)?
	  test.ps1:13 "Done $scriptname"

      Step-Over コマンドは関数を実行し、スクリプトの次のステートメントをプレビュ
      ーして、この最後の行を出力します。

      Stop コマンド (t) を使用してデバッガーを終了します。コマンド プロンプトは
      標準のコマンド プロンプトに戻ります。

	  C:\ps-test>

      ブレークポイントを削除するには、Get-PsBreakpoint および Remove-PsBreakpoin
      t コマンドレットを使用します。

	  PS C:\ps-test> Get-PsBreakpoint | Remove-PSBreakpoint

      PsVersion 関数に新しいコマンドのブレークポイントを作成します。

          PS C:\ps-test> Set-PsBreakpoint -command psversion -script test.ps1 

      このコマンドは次のように短縮することができます。

          PS C:\ps-test> sbp -c psversion -s test.ps1

      ここで、スクリプトを実行します。	

          PS C:\ps-test> .\test.ps1
          ヒット 'C:\ps-test\test.ps1:psversion' のコマンドのブレークポイント

          test.ps1:12 psversion
          DBG>

      スクリプトは関数呼び出しでブレークポイントに到達します。この時点で、関数
      はまだ呼び出されていません。これによって、Set-PsBreakpoint の Action パラ
      メーターを使用して、ブレークポイントの実行条件を設定したり、ログの起動、診
      断またはセキュリティ スクリプトの起動などの前処理タスクまたは診断タスクを
      実行したりすることができます。

      アクションを設定するには、Continue コマンド (c) を使用してスクリプトを終了
      し、Remove-PsBreakpoint コマンドを使用して現在のブレークポイントを削除しま
      す (ブレークポイントは読み取り専用のため、現在のブレークポイントにアクショ
      ンを追加することはできません)。

	  DBG> c
	  Windows PowerShell 2.0
	  Have you run a background job today (start-job)?
	  Done C:\ps-test\test.ps1

	  PS C:\ps-test> get-psbreakpoint | remove-psbreakpoint
	  PS C:\ps-test>

      ここで、アクションを指定した新しいコマンドのブレークポイントを作成します。
      次のコマンドは、関数を呼び出すと $scriptname 変数の値をログに記録するアクシ
      ョンを指定したコマンドのブレークポイントを設定します。アクションに Break キ
      ーワードが使用されていないため、実行は停止しません (バッククォート記号 (`) 
      は行連結文字です)。

         PS C:\ps-test> set-psbreakpoint -command psversion -script test.ps1  `
         -action { add-content "The value of `$scriptname is $scriptname." `
         -path action.log}

      ブレークポイントの条件を設定するアクションを追加することもできます。次のコ
      マンドでは、実行ポリシーが RemoteSigned に設定されている場合にのみ、コマン
      ドのブレークポイントが実行されます。RemoteSigned は、スクリプトの実行を許
      可する最も制限の厳しいポリシーです (バッククォート記号 (`) は連結文字です)。

          PS C:\ps-test> set-psbreakpoint -script test.ps1 -command psversion `
          -action { if ((get-executionpolicy) -eq "RemoteSigned") { break }}

      このアクションの Break キーワードは、ブレークポイントを実行するようにデバッ
      ガーに指示します。Continue キーワードを使用して、中断せずに実行するようにデ
      バッガーに指示することもできます。既定のキーワードは Continue であるため、
      実行を停止するには Break を指定する必要があります。

      ここで、スクリプトを実行します。

	  PS C:\ps-test> .\test.ps1
	  ヒット 'C:\ps-test\test.ps1:psversion' のコマンドのブレークポイント

	  test.ps1:12 psversion
    
      実行ポリシーは RemoteSigned に設定されているため、実行は関数呼び出しで停止
      します。

      この時点で、コール スタックの確認が必要になる場合もあります。Get-PsCallSta
      ck コマンドレットまたは Get-PsCallStack デバッガー コマンド (k) を使用しま
      す。次のコマンドは、現在のコール スタックを取得します。

	  DBG> k
	  2: prompt
	  1: .\test.ps1: $args=[]
	  0: prompt: $args=[]

      この例では、Windows PowerShell デバッガーを使用する多くの方法のうちの一部の
      みを示します。

      デバッガーのコマンドレットの詳細については、次のコマンドを入力してください。

          help  -full

      たとえば、次のように入力します。

          help set-psbreakpoint -full

関連項目
    Disable-PsBreakpoint
    Get-PsBreakpoint  
    Remove-PsBreakpoint
    Set-PsBreakpoint 
    Set-PsDebug
    Set-Strictmode
    Write-Debug
    Write-Verbose  
    Enable-PsBreakpoint
    Get-PsCallStack
	
記事で解説しているパソコンの環境
 基本ソフト: Windows 7
 キーワード: Windows PowerShell、ヘルプ、HelpFile、about_debuggers
ご利用数: 1858290
感想・要望・問い合わせは こちら