如何在 Windows PowerShell ISE 中針對指令碼進行偵錯
本文說明如何使用 Windows PowerShell 整合式腳本環境 (ISE) 可視化偵錯功能,對本機電腦上的腳本進行偵錯。
如何管理斷點
斷點是腳本中您想要暫停作業的指定位置,因此您可以檢查腳本執行所在的變數和環境的目前狀態。 在斷點暫停文本之後,您可以在控制檯窗格中執行命令,以檢查腳本的狀態。 您可以輸出變數或執行其他命令。 您甚至可以修改目前執行中腳本內容所看見之任何變數的值。 檢查您想要查看的內容之後,您可以繼續執行腳本的作業。
您可以在 Windows PowerShell 偵錯環境中設定三種類型的斷點:
行斷點。 腳本會在腳本作業期間到達指定的行時暫停
變數斷點。 每當指定的變數值變更時,腳本就會暫停。
命令斷點。 每當指定的命令即將在腳本作業期間執行時,腳本就會暫停。 它可以包含參數,以進一步篩選斷點,只篩選您想要的作業。 命令也可以是您建立的函式。
其中,在 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
) 解決此問題:
在腳本中,將自動變數的值指派給新的變數。
將滑鼠停留在腳本窗格中的新變數,或在控制檯窗格中輸入新變數,以顯示新變數的值。
例如,若要顯示變數的值 $MyInvocation
,請在腳本中將值指派給新的變數,例如 $scriptName
,然後將滑鼠停留或輸入 $scriptName
變數以顯示其值。
# In C:\ps-test\MyScript.ps1
$scriptName = $MyInvocation.PSCommandPath
# In the Console Pane:
.\MyScript.ps1
$scriptName
C:\ps-test\MyScript.ps1