如何管理斷點如何管理調試會話如何在調試過程中步越、步入和步出如何在調試時顯示變量的值
如何管理斷點
斷點是腳本中妳想要操作暫停的指定位置,這樣妳可以檢查變量的當前狀態和腳本運行的環境。 壹旦妳的腳本被斷點暫停,妳可以在控制臺窗格中運行命令來檢查妳的腳本狀態。 妳可以輸出變量或運行其他命令。 甚至可以修改對正在運行的腳本的上下文可見的任何變量的值。 檢查完妳想要查看的內容後,可以恢復該腳本的運行。
可以在 Windows PowerShell 調試環境中設置三種類型的斷點:
行斷點 **** 在腳本運行期間,當達到所指定的行時,腳本暫停
變量斷點。 每當指定變量的值發生更改時,腳本暫停。
命令斷點。 在腳本運行期間,每當要運行指定命令時,腳本暫停。 它可以包括參數,以便僅對所需操作進壹步篩選斷點。 該命令還可以是妳創建的函數。
其中,在 Windows PowerShell ISE 調試環境中,只有行斷點可以通過使用菜單或鍵盤快捷方式進行設置。 可以設置其他兩種類型的斷點,但應通過使用 Set-PSBreakpoint [m2] 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
移除斷點
移除斷點會將其刪除。 如果妳認為稍後還可能再次使用,請考慮改為禁用。 右鍵單擊妳想要移除的斷點所在的行,然後單擊“切換斷點”。 或者,單擊妳想要移除的斷點所在的行,然後在“調試”菜單上,單擊“切換斷點”。******** 以下腳本是如何通過使用 Remove-PSBreakpoint cmdlet 從控制臺窗格中移除具有指定 ID 的斷點的示例。
# 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-breakpoint | remove-breakpoint
禁用斷點
禁用斷點不會將斷點移除;只是會將其關閉,直至啟用。 若要禁用特定行斷點,右鍵單擊妳想要禁用的行斷點所在的行,然後單擊“禁用斷點”。 或者,單擊妳想要禁用的斷點所在的行,然後按 F9,或在“調試”菜單上,單擊“禁用斷點”。******** 以下腳本是如何通過使用 Disable-PSBreakpoint cmdlet 從控制臺窗格中移除具有指定 ID 的斷點的示例。
# 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
如果妳嘗試顯示這些變量中的任何壹個的值,妳將獲取調試器使用的內部管道中變量的值,而不是腳本中變量的值。 對於壹些變量($_、$Input、$MyInvocation、$PSBoundParameters 和 $Args),可以使用以下方法解決此問題:
在腳本中,將自動變量的值分配給壹個新變量。
通過將鼠標懸停在腳本窗格中新變量上,或通過在控制臺窗格中鍵入新變量來顯示新變量的值。
例如,若要顯示 $MyInvocation 變量的值,在腳本中,將該值分配給壹個新變量(如 $scriptname),然後將鼠標懸停在 $scriptname 變量上,或鍵入 $scriptname 變量以顯示其值。
#In MyScript.ps1
$scriptname = $MyInvocation.MyCommand.Path
#In the Console Pane:
C:\ps-test> $scriptname
C:\ps-test\MyScript.ps1