Отладка сценария PowerShell с помощью редактора ISE

Привет, писатели и потребители сценариев с ошибками.
В этом сообщении описываются основы работы с графическим отладчиком в ISE. Здесь приведено множество отличных рекомендаций, а также несколько советов и трюков.
Отладчик поддерживает как коммандлеты, так и пользовательский интерфейс. Коммандлеты включают Enable/Disable/Get/Set/Remove-PsBreakpoint и Get-PsCallStack.
Основной способ работы – расставить в сценарии точки останова, продолжать работу (F5) для перехода от одной точки останова до другой и проходить функции, входить и выходить из них для перемещения по программе. Также можно использовать стек вызовов и указывать на переменные для получения их значений.

Точки останова

Добавить точку остановка в строку просто, в любом сценарии нужно нажать клавишу F9 или воспользоваться контекстным меню (Enable Breakpoint). Однако их можно добавлять только в сохраненные сценарии. Так что если у вас есть файл untitled.ps1, сначала сохраните его с именем «powershellmademesaveyou.ps1». Так же можно работать с файлами psm1. Точки останова можно ставить на самые разные строки, вы сможете увидеть как они работают в любых циклах, в блоках сценариев, в блоках if-else, в ловушках и т.д..
Специальные точки останова можно добавлять с помощью Set-PSBreakpoint (сокращение «sbp»). Например, «sbp -command write-error» перенесет вас к команде, когда она будет исполняться, а «sbp -variable servername» будет останавливать исполнение при изменении содержимого (или обращении) к переменной $servername. Эти точки останова не выводятся на экран и должны устанавливаться/удаляться через командную строку.
Чтобы просмотреть список таких точек, перейдите к Debug->List Breakpoints.
Их можно также легко удалить через контекстное меню или клавишей F9 (или через меню Debug, а также коммандлетом remove-psbreakpoint)
Точки останова также можно добавлять при остановке отладчика, но не во время активного исполнения сценария.

Навигация и исследование

Навигация и исследование в ISE оформлены очень аккуратно. Для перехода от одной точки останова к другой воспользуйтесь командой Continue (F5). Чтобы перешагнуть функции нажмите F10, для входа в функцию - F11, а для выхода из функции - Shift-F11. Во время навигации легко добавить новые контрольные точки, которые можно использоваться для перешагивания через функции.
ISE автоматически откроет сценарий, в котором находится вызванная функция.
Оказавшись в интересующей вас точке, вы можете:
- Установить курсор на переменную, чтобы увидеть ее значение. Это очень быстрый способ узнать, что происходит
- Выполнить выделенный фрагмент с помощью клавиши F6. Вы можете выполнить условие блока if, чтобы узнать результат. Вы можете выполнить часть строки сценария, независимо от остального фрагмента.
-          Выполнить команду в панели команд. Вы можете проверить сложное выражение с полными настройками. Также здесь можно изменить значения переменных.
- Получить стек вызовов (Ctrl-Shift-D), чтобы узнать, как глубоко лежит ваша проблема
- Запросить справку по коммандлету, выбрав его с помощью мыши и нажав F1
Возможно это подходящий момент прекратить отладку (Shift-F5) и перезапуститься. Во время отладки сценарии блокируются, так что для продолжения редактирования вам следует прекратить отладку.

Получайте удовольствие от отладки с ISE Extensions

- Получить последнее исключение
o   $psISE.CustomMenu.Submenus.Add('Show Exception', {$error[$Error.Count - 1].Exception | fl -f *}, "Ctrl+Shift+E")
- Информация о выборе дампа
o   $psISE.CustomMenu.Submenus.Add('Get-Member', {iex $psISE.CurrentOpenedFile.Editor.SelectedText | gm | ft; iex $psISE.CurrentOpenedFile.Editor.SelectedText | fl -f *; }, "Ctrl+D")
- Переход к определению
o   function GotoDefinition($commandName)
{
    $command = gcm -CommandType Function $commandName
    $file = $command.ScriptBlock.File
    $position = $command.ScriptBlock.StartPosition
    $runspace = $psISE.CurrentOpenedRunspace
    $runspace.OpenedFiles.Add($file)
    ($runspace.OpenedFiles | ?{$_.FullPath -eq $file}).Editor.SetCaretPosition($position.StartLine, $position.StartColumn)
}
$psISE.CustomMenu.Submenus.Add("GotoDefinition", {GotoDefinition $psISE.CurrentOpenedFile.Editor.SelectedText}, "Ctrl+Shift+G")
GotoDefinition не будет работать, пока функции не определены, но вы можете дополнить ее, чтобы она выполняла дополнительную работу.

powershell_debugger

Надеюсь, это вам поможет,

Ибрагим Абдул Рахим (Ibrahim Abdul Rahim) [MSFT]

Перевод: Виктор Горбунков