如何在 Windows PowerShell ISE 中針對指令碼進行偵錯

本文說明如何使用 Windows PowerShell 整合式腳本環境 (ISE) 可視化偵錯功能,對本機電腦上的腳本進行偵錯。

如何管理斷點

斷點是腳本中您想要暫停作業的指定位置,因此您可以檢查腳本執行所在的變數和環境的目前狀態。 在斷點暫停文本之後,您可以在控制檯窗格中執行命令,以檢查腳本的狀態。 您可以輸出變數或執行其他命令。 您甚至可以修改目前執行中腳本內容所看見之任何變數的值。 檢查您想要查看的內容之後,您可以繼續執行腳本的作業。

您可以在 Windows PowerShell 偵錯環境中設定三種類型的斷點:

  1. 行斷點。 腳本會在腳本作業期間到達指定的行時暫停

  2. 變數斷點。 每當指定的變數值變更時,腳本就會暫停。

  3. 命令斷點。 每當指定的命令即將在腳本作業期間執行時,腳本就會暫停。 它可以包含參數,以進一步篩選斷點,只篩選您想要的作業。 命令也可以是您建立的函式。

其中,在 Windows PowerShell ISE 偵錯環境中,只能使用功能表或鍵盤快捷方式來設定行斷點。 您可以設定其他兩種類型的斷點,但會使用 Set-PSBreakpoint Cmdlet 從控制檯窗格進行設定。 本節說明如何使用可用的功能表,在 Windows PowerShell ISE 中執行偵錯工作,以及使用腳本從控制檯窗格執行更廣泛的命令。

設定斷點

只有在儲存斷點之後,才能在腳本中設定斷點。 以滑鼠右鍵按下您要設定行斷點的行,然後按兩下 [ 切換斷點]。 或者,按下您要設定行斷點的行,然後按 F9,或在 [偵錯] 功能表上,按兩下 [切換斷點]。

下列腳本是如何使用 Set-PSBreakpoint Cmdlet,從控制檯窗格設定變數斷點的範例。

# This command sets a breakpoint on the Server variable in the Sample.ps1 script.
Set-PSBreakpoint -Script sample.ps1 -Variable Server

列出所有斷點

顯示目前 Windows PowerShell 工作階段中的所有斷點。

在 [ 偵錯] 功能表上,按兩下 [ 列出斷點]。 下列腳本是如何使用 Get-PSBreakpoint Cmdlet,從控制檯窗格 列出所有斷點 的範例。

# This command lists all breakpoints in the current session.
Get-PSBreakpoint

拿掉斷點

拿掉斷點會刪除它。

如果您認為稍後可能想要再次使用它,請考慮 改為停用斷點 。 以滑鼠右鍵按下您要移除斷點的行,然後按兩下 [ ToggleBreakpoint]。 或者,按下您要移除斷點的行,然後在 [ 錯] 功能表上,按兩下 [ 切換斷點]。 下列腳本是如何使用 Remove-PSBreakpoint Cmdlet,從控制檯窗格 移除具有指定標識符的斷點

# This command deletes the breakpoint with breakpoint ID 2.
Remove-PSBreakpoint -Id 2

移除所有中斷點

若要移除目前會話中定義的所有斷點,請在 [ 錯] 功能表上,按兩下 [ 移除所有斷點]。

下列腳本是如何使用 Remove-PSBreakpoint Cmdlet,從控制檯窗格 移除所有斷點 的範例。

# This command deletes all of the breakpoints in the current session.
Get-PSBreakpoint | Remove-PSBreakpoint

停用斷點

停用斷點並不會移除它。 它會關閉,直到啟用為止。 若要停用特定行斷點,請以滑鼠右鍵按下您要停用斷點的行,然後按兩下 [ 停用斷點]。

或者,按下您要停用斷點的行,然後按 F9,或在 [偵錯] 功能表上,按兩下 [停用斷點]。 下列腳本範例說明如何使用 Disable-PSBreakpoint Cmdlet,從控制檯窗格中移除具有指定標識符的 斷點

# This command disables the breakpoint with breakpoint ID 0.
Disable-PSBreakpoint -Id 0

停用所有中斷點

停用斷點並不會移除它;它會關閉,直到啟用為止。 若要停用目前會話中的所有斷點,請在 [ 錯] 功能表上,按兩下 [ 停用所有斷點]。 下列腳本是如何使用 Disable-PSBreakpoint Cmdlet,從控制檯窗格 停用所有斷點 的範例。

# This command disables all breakpoints in the current session.
# You can abbreviate this command as: "gbp | dbp".
Get-PSBreakpoint | Disable-PSBreakpoint

啟用斷點

若要啟用特定的斷點,請以滑鼠右鍵按下您要啟用斷點的行,然後按兩下 [ 啟用斷點]。 或者,按下您要啟用斷點的行,然後按 F9,或在 [偵錯] 功能表上,按兩下 [啟用斷點]。 下列腳本是如何使用 Enable-PSBreakpoint Cmdlet,從控制檯窗格 啟用特定斷點 的範例。

# This command enables breakpoints with breakpoint IDs 0, 1, and 5.
Enable-PSBreakpoint -Id 0, 1, 5

啟用所有中斷點

若要啟用目前會話中定義的所有斷點,請在 [ 錯] 功能表上,按兩下 [ 啟用所有斷點]。 下列腳本是如何使用 Enable-PSBreakpoint Cmdlet,從控制檯窗格 啟用所有斷點 的範例。

# This command enables all breakpoints in the current session.
# You can abbreviate the command by using their aliases: "gbp | ebp".
Get-PSBreakpoint | Enable-PSBreakpoint

如何管理偵錯會話

開始偵錯之前,您必須設定一或多個斷點。 除非儲存您要偵錯的腳本,否則您無法設定斷點。 如需如何設定斷點的指示,請參閱 如何管理斷點Set-PSBreakpoint。 開始偵錯之後,您必須先停止偵錯,才能編輯腳本。 在執行之前,會自動儲存已設定一或多個斷點的腳本。

若要啟動偵錯

F5 ,或在工具列上按一下 [執行腳稿 ] 圖示,或在 [ 偵錯 ] 功能表上按一下 [ 執行/繼續]。 腳本會執行,直到遇到第一個斷點為止。 它會暫停該處的作業,並醒目提示暫停的行。

繼續偵錯

F5,或在工具列上單擊 [執行腳本] 圖示,或在[偵錯] 功能表上,按一下 [執行/繼續],或在控制檯窗格中輸入 C ,然後按 ENTER。 這會導致腳本繼續執行至下一個斷點,如果沒有遇到任何進一步的斷點,則繼續執行到腳本的結尾。

若要檢視呼叫堆疊

呼叫堆疊會顯示文本中的目前執行位置。 如果文稿是在由不同函式呼叫的函式中執行,則輸出中的其他數據列會在顯示中表示。 最底層的數據列會顯示原始腳本及其中呼叫函式的行。 下一行會顯示該函式及其中可能呼叫另一個函式的行。 最上層數據列會顯示設定斷點之目前行的目前內容。

暫停時,若要查看目前的呼叫堆疊,請按 CTRL+SHIFT+D,或在 [偵錯] 功能表上,按兩下 [顯示呼叫堆疊],或在控制檯窗格中輸入 K ,然後按 ENTER。

停止偵錯

SHIFT+F5,或在 [偵錯] 功能表上,按一下 [停止除錯程式],或在控制檯窗格中輸入 Q ,然後按 ENTER。

如何在偵錯時逐步執行、逐步執行和逐步執行

逐步執行是一次執行一個語句的程式。 您可以在程式代碼行上停止,並檢查變數的值和系統的狀態。 下表描述常見的偵錯工作,例如逐步執行、逐步執行和逐步執行。

偵錯工作 描述 如何在 PowerShell ISE 中完成
逐步執行 執行目前的 語句,然後在下一個語句停止。 如果目前的語句是函式或腳本呼叫,則調試程式會逐步執行該函式或腳本,否則會在下一個語句停止。 F11 ,或在 [ 偵錯] 功能表上,單擊 [逐步執行],或在控制檯窗格中輸入 S 並按 ENTER
逐程序 執行目前的 語句,然後在下一個語句停止。 如果目前的語句是函式或腳本呼叫,則調試程式會執行整個函式或腳本,並在函數調用之後的下一個語句停止。 F10 ,或在 [ 偵錯] 功能表上,單擊 [逐步執行],或在控制檯窗格中輸入 V 並按 ENTER
跳出 如果函式是巢狀的,則從目前的函式中逐步執行,並增加一個層級。 如果在主體中,腳本會執行到結尾,或執行至下一個斷點。 會執行略過的語句,但不會逐步執行。 SHIFT+F11,或在 [偵錯] 功能表上,單擊 [跳出],或在控制檯窗格中輸入O並按 ENTER。
繼續 繼續執行至結尾,或繼續執行至下一個斷點。 會執行略過的函式和調用,但不會逐步執行。 F5 ,或在 [ 偵錯] 功能表上,單擊 [ 執行/繼續],或在控制檯窗格中輸入 C 並按 ENTER

如何在偵錯時顯示變數的值

您可以在逐步執行程式碼時,在腳本中顯示變數的目前值。

顯示標準變數的值

使用下列其中一種方法:

  • 在 [腳本窗格] 中,將滑鼠停留在變數上方,以將其值顯示為工具提示。

  • 在控制檯窗格中,輸入變數名稱,然後按 ENTER

ISE 中的所有窗格一律位於相同的範圍內。 因此,當您偵錯文本時,您在控制檯窗格中輸入的命令會在腳本範圍中執行。 這可讓您使用控制檯窗格來尋找變數的值,並呼叫只在腳本中定義的函式。

顯示自動變數的值

您可以在偵錯文本時,使用上述方法來顯示幾乎所有變數的值。 不過,這些方法不適用於下列自動變數。

  • $_

  • $Input

  • $MyInvocation

  • $PSBoundParameters

  • $Args

如果您嘗試顯示這些變數的值,您會在調試程式所使用的內部管線中取得該變數的值,而不是腳本中的變數值。 您可以使用下列方法,針對幾個變數$_ (、$MyInvocation$PSBoundParameters$Input$Args) 解決此問題:

  1. 在腳本中,將自動變數的值指派給新的變數。

  2. 將滑鼠停留在腳本窗格中的新變數,或在控制檯窗格中輸入新變數,以顯示新變數的值。

例如,若要顯示變數的值 $MyInvocation ,請在腳本中將值指派給新的變數,例如 $scriptName,然後將滑鼠停留或輸入 $scriptName 變數以顯示其值。

# In C:\ps-test\MyScript.ps1
$scriptName = $MyInvocation.PSCommandPath
# In the Console Pane:
.\MyScript.ps1
$scriptName
C:\ps-test\MyScript.ps1

另請參閱

探索 Windows PowerShell ISE