Отладка сценариев в интегрированной среде сценариев Windows PowerShell — PowerShell
- Статья
- Чтение занимает 7 мин
В этой статье описано, как отлаживать сценарии на локальном компьютере визуальными инструментами отладки интегрированной среды сценариев (ISE) Windows PowerShell.
Управление точками останова
Точка останова — это назначенная точка в сценарии, на которой выполнение временно останавливается, чтобы можно было проверить текущее состояние переменных и среды, в которой выполняется сценарий.
После приостановки сценария в точке останова можно выполнить команды в области консоли для проверки его состояния. Можно выводить переменные и выполнять другие команды. Можно даже изменять значения любых переменных, видимых в контексте текущего выполняемого сценария. После получения нужных сведений можно продолжить выполнение сценария.
В среде отладки Windows PowerShell можно установить три вида точек останова:
Точка останова по строке. Сценарий приостанавливается при достижении назначенной строки.
Точка останова по переменной. Сценарий приостанавливается при изменении значения, назначенного переменной.
Точка останова по команде. Сценарий приостанавливается перед выполнением назначенной команды. Можно указать параметры, чтобы отфильтровать для точки останова только нужную операцию. Команда также может быть созданной вами функцией.
В среде отладки интегрированной среды сценариев Windows PowerShell только точки останова по строке можно задать с помощью меню или сочетаний клавиш. Точки останова двух других типов также можно задать, но в области консоли, используя командлет Set-PSBreakpoint. В этом разделе описано, как выполнять задачи отладки в интегрированной среде сценариев Windows PowerShell, по возможности используя меню, и выполнять более широкий набор команд из области консоли, используя сценарии.
Задание точки останова
Точку останова можно задать в сценарии только после его сохранения. Щелкните правой кнопкой мыши строку, где нужно задать точку останова, и выберите пункт
Следующий сценарий — пример создания точки останова по переменной из области консоли с помощью командлета Set-PSBreakpoint:
# 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:
# This command lists all breakpoints in the current session. Get-PSBreakpoint
Удаление точки останова
Удаляет указанную точку останова.
Если вы считаете, что точка останова может понадобиться в будущем, лучше отключите ее. Щелкните правой кнопкой мыши строку, где нужно удалить точку останова, и выберите пункт ToggleBreakpoint (Точка останова). Другой вариант: щелкните строку, где нужно удалить точку останова, и выберите пункт
# This command deletes the breakpoint with breakpoint ID 2. Remove-PSBreakpoint -Id 2
Удаление всех точек останова
Чтобы удалить все точки останова, определенные в текущем сеансе, выберите команду Удалить все точки останова в меню Отладка.
Следующий сценарий — пример удаления всех точек останова из области консоли с помощью командлета Remove-PSBreakpoint:
# This command deletes all of the breakpoints in the current session. Get-PSBreakpoint | Remove-PSBreakpoint
Отключение точки останова
Отключение точки останова не приводит к ее удалению. Она просто остается неактивной, пока не будет включена. Щелкните правой кнопкой мыши строку, где нужно отключить точку останова, и выберите команду Отключить точку останова.
Другой вариант: щелкните строку, где нужно отключить точку останова, и нажмите клавишу F9 либо выберите Отключить точку останова в меню Отладка. Следующий сценарий — пример отключения точки останова с указанным идентификатором из области консоли с помощью командлета Disable-PSBreakpoint.
# This command disables the breakpoint with breakpoint ID 0. Disable-PSBreakpoint -Id 0
Отключение всех точек останова
Отключение точки не приводит к ее удалению; она просто остается неактивной, пока не будет включена. Чтобы отключить все точки останова в текущем сеансе, выберите команду Отключить все точки останова в меню Отладка. Следующий сценарий — пример отключения всех точек останова из области консоли с помощью командлета Disable-PSBreakpoint:
# This command disables all breakpoints in the current session. # You can abbreviate this command as: "gbp | dbp". Get-PSBreakpoint | Disable-PSBreakpoint
Включение точки останова
Щелкните правой кнопкой мыши строку, где нужно включить точку останова, и выберите команду Включить точку останова. Другой вариант: щелкните строку, где нужно включить точку останова, и нажмите клавишу F9 либо выберите Включить точку останова в меню Отладка. Следующий сценарий — пример включения отдельных точек останова из области консоли с помощью командлета Enable-PSBreakpoint:
# This command enables breakpoints with breakpoint IDs 0, 1, and 5. Enable-PSBreakpoint -Id 0, 1, 5
Включение всех точек останова
Чтобы включить все точки останова, определенные в текущем сеансе, выберите команду

# 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, щелкните значок Run Script (Выполнить сценарий) на панели инструментов, выберите Run/Continue (Выполнить/продолжить) в меню Debug (Отладка) либо введите C
в области консоли и нажмите клавишу ВВОД. В результате выполнение продолжается до следующей точки останова, а при ее отсутствии — до конца сценария.
Просмотр стека вызовов
Стек вызовов отображает текущее расположение выполнения в сценарии. Если сценарий выполняется в функции, вызванной другой функцией, это отражается путем добавления строк в выходные данные. В самой нижней строке отображается исходный сценарий и его строка, в которой была вызвана функция. Предыдущая строка показывает эту функцию и ее строку, в которой могла быть вызвана другая функция. В самой верхней строке отображается текущий контекст для текущей строки, в которой задана точка останова.
Чтобы просмотреть текущий стек вызовов, пока выполнение приостановлено, нажмите клавиши CTRL+SHIFT+D, выберите команду Display Call Stack (Отображение стека вызовов) в меню Debug (Отладка) или введите K
в области консоли и нажмите клавишу ВВОД.
Остановка отладки
Нажмите клавиши SHIFT+F5, выберите команду Stop Debugger (Остановить отладчик) в меню Debug (Отладка) или введите Q
в области консоли и нажмите клавишу ВВОД.
Выполнение шагов с обходом, заходом и выходом во время отладки
Пошаговое выполнение сценария — это поочередное выполнение его операторов. Выполнение можно остановить на любой строке кода, чтобы проверить значения переменных и состояние системы. В следующей таблице описаны задачи, часто выполняемые при отладке, такие как шаги с обходом, заходом и выходом:
Задача отладки | Description | Способ выполнения в интегрированной среде сценариев PowerShell |
---|---|---|
Шаг с заходом | Выполняет текущий оператор и останавливается на следующем операторе.![]() | Нажмите клавишу S в области консоли и нажмите клавишу ВВОД. |
Шаг с обходом | Выполняет текущий оператор и останавливается на следующем операторе. Если текущий оператор является вызовом функции или сценария, отладчик выполняет их полностью и останавливается на операторе, следующем после этого вызова. | Нажмите клавишу F10, выберите Step Over (Шаг с обходом) в меню Debug (Отладка) или введите V в области консоли и нажмите клавишу ВВОД. |
Шаг с выходом | Выходит из текущей функции и переходит на один уровень выше, если функция является вложенной.![]() | Нажмите клавиши SHIFT+F11, выберите команду Step Out (Шаг с выходом) в меню Debug (Отладка) или введите O в области консоли и нажмите клавишу ВВОД. |
Продолжить | Продолжает выполнение до конца или до следующей точки останова. Пропущенные функции и вызовы выполняются, но в них отладчик не останавливается. | Нажмите клавишу F5, выберите Run/Continue (Выполнить/продолжить) в меню Debug (Отладка) или введите C в области консоли и нажмите клавишу ВВОД. |
Отображение значений переменных при отладке
При пошаговом выполнении кода можно отобразить текущие значения переменных в сценарии.
Отображение значений стандартных переменных
Используйте один из следующих методов.
Все области в интегрированной среде сценариев всегда относятся к одной области действия. Таким образом, при отладке сценария команды, вводимые в области консоли, выполняются в области сценариев. Это позволяет использовать область консоли для поиска значений переменных и вызова функций, которые определены только в сценарии.
Отображение значений автоматических переменных
Описанный выше метод позволяет отобразить значения почти всех переменных при отладке сценария. Однако он не работает для следующих автоматических переменных:
$_
$Input
$MyInvocation
$PSBoundParameters
$Args
При попытке отобразить значение любой из этих переменных отображается значение переменной из внутреннего конвейера отладчика, а не переменной в сценарии. Для некоторых переменных (
$_
, $Input
, $MyInvocation
, $PSBoundParameters
и $Args
) это можно обойти с помощью следующего метода.
Присвойте значение автоматической переменной в сценарии новой переменной.
Отобразите значение новой переменной, наведя на нее указатель мыши в области сценариев или введя ее имя в области консоли.
Например, чтобы отобразить значение переменной $MyInvocation
в сценарии, присвойте ее значение новой переменной, например $scriptName
, а затем наведите указатель мыши на переменную $scriptName
или введите ее для отображения значения.
# In C:\ps-test\MyScript.ps1 $scriptName = $MyInvocation.MyCommand.Path
# In the Console Pane: .\MyScript.ps1 $scriptName
C:\ps-test\MyScript.ps1
См. также:
Обзор интегрированной среды скриптов Windows PowerShell
Отладка сценариев Windows PowerShell — База полезных знаний
Windows Server 2016 предоставил для отладки сценариев Windows PowerShell несколько улучшений:
- Break All
- Удалённое редактирование
- Удалённая отладка
- Отладка фонового задания
- Отладка Runspaces
- Удалённая отладка Desired State Configuration
Давайте посмотрим на каждый элемент более подробно.
Содержание:
Break All
Break All (прервать всё) — очень полезная останавливающая работающий скрипт функция, дающая возможность перейти в отладчик и узнать как работает этот скрипт и каково текущее состояние переменных или других элементов. Поддержка была включена для консоли Windows PowerShell и ISE.
Чтобы использовать отладчик в сеансе консоли, нажмите Ctrl+Break
В Windows PowerShell ISE можно нажать Ctrl+B или, щёлкнуть в меню «Отладка» и выбрать команду «Break All».
Удалённое редактирование
В текущей Windows PowerShell ISE можно открывать и редактировать файл напрямую в удалённом сеансе Windows PowerShell. С помощью новой команды «PSEdit», вы можете непосредственно редактировать файлы как локально, так и в удалённых сеансах.
Следующий код показывает пример в действии:
[Cloud01]: PS C:\> PSEdit C:\WinDemo\Get-ComputerInfo.ps1
При выполнении PSEdit, он откроет файл в ISE, где можно внести изменения, сохранить их на удалённый компьютер и повторно выполнить код.
Удалённая отладка
Расширяя возможности удалённого редактирования, вы теперь можете отлаживать запущенный на удалённом сеансе с ISE скрипт.
Командлет Set-PsBreakpoint задаёт в коде точку останова, а затем можно использовать командлет Write-Debug и вывести полезную для использования в ваших сценариях, если вы сталкиваетесь с точкой останова, информацию. В этот момент вас переместит в отладчик, где потребуется посмотреть на имеющуюся информацию и выполнить некоторую дополнительную работу. Рисунок ниже показывает эту операцию.
Пример кода удалённой отладки в Windows Powershell ISE
Когда скрипт встречает в удалённом сеансе точку останова, он отображает сообщение, указывающее, что это сделано. Следующий рисунок показывает пример сообщения.
Предупреждение об останове в удалённом сеансе
Не все удалённые сеансы будут поддерживать сеанс удалённой отладки, но при подключении к удалённому сеансу с помощью командлета Connect-PSSession, вы увидите результат, показанный на рисунке ниже. Вывод также позволяет узнать её доступность.
Доступность удалённой отладки
Если удалённая отладка доступна, вы можете подключиться к сеансу с помощью командлета Enter-PSSession, который подключит вас непосредственно к отладчику.
Удалённый отладчик в действии
Отладка фонового задания
Одной из полезных функций Windows PowerShell является способность выполнять скрипты как фоновые задания. Эти задания могут выполняться без отображения на экране главной консоли, позволяя одновременное продолжение выполнений дополнительных задач. Иногда задания для устранения неполадок могут быть сложными и для разработки надёжных сценариев, которые действительно могут выполняться с рабочего места, потребуется много проб и ошибок.
Теперь, в Server 2016, Windows PowerShell вводит новый командлет Debug-Job, который даёт вам возможность отладить эти фоновые задания более эффективно. Следующий рисунок показывает использование этого командлета. Обратите внимание на то, как Debug-Job показывает вам линию и характеристики прерывания фоновой работы.
Командлет Debug-Job, выводящий сообщение об ошибке в фоновом задании
Чтобы добраться до этого состояния останова, можно воспользоваться тем же командлетом Set-PSBreakPoint или Wait-Debugger. Они используются для «приостановки» сценария и ввода отладчика. Вы можете ввести эти командлеты в свой скрипт, а затем проверить состояние задания. Так вы узнаете, столкнулся ли он с точкой останова и готова ли отладка. Рисунок ниже показывает пример этого.
Состояние фонового задания
Отладка Runspaces
Чтобы решить несколько, связанных с выполнением фоновых заданий, проблем, таких как проблемы с ресурсами и производительностью, был введён Runspaces. Runspaces отличается от рабочих мест тем, что генерирует для окружающей среды новый поток выполнения, который не несёт тех же затрат, что фоновое задание.
Подробнее. Больше информации о Runspaces и его использовании на http://blogs.technet.microsoft.com/heyscriptingguy/2015/11/26/beginning-use-of-powershell- runspaces-part-1/.
Следующий рисунок отображает создание Runspaces.
Создание Runspaces
Для отладки Runspaces вам необходимо получить его «ID», рисунок ниже показывает доступные runspaces, а затем ввести сеанс отладки с помощью командлета Debug-Runspace.
Отладка runspace
Первый runspace, ID 1, всегда исходный сеанс Windows PowerShell, в котором вы находитесь. Для более глубокого изучения runspacees в вашей среде, используйте предыдущие ссылки.
Как отлаживать сценарии в Windows PowerShell ISE — PowerShell
- Статья
- 9 минут на чтение
В этой статье описывается отладка сценариев на локальном компьютере с помощью Windows PowerShell. Функции визуальной отладки Integrated Scripting Environment (ISE).
Как управлять точками останова
Точка останова — это место в сценарии, где вы хотите приостановить операцию, чтобы
может проверить текущее состояние переменных и среду, в которой работает ваш сценарий. Как только ваш сценарий будет приостановлен точкой останова, вы можете запустить команды на панели консоли, чтобы проверить
состояние вашего скрипта. Вы можете выводить переменные или запускать другие команды. Вы даже можете изменить значение
любых переменных, видимых в контексте текущего сценария. После того, как у вас есть
просмотрев то, что вы хотите увидеть, вы можете возобновить работу скрипта.
В среде отладки Windows PowerShell можно установить три типа точек останова:
Точка останова строки . Сценарий приостанавливается, когда во время операции достигается указанная строка. скрипта
Переменная точка останова. Сценарий приостанавливается всякий раз, когда изменяется значение назначенной переменной.
Точка останова команды. Сценарий приостанавливается всякий раз, когда назначенная команда должна быть запущена. во время работы скрипта. Он может включать параметры для дальнейшей фильтрации точки останова.
только та операция, которую вы хотите. Команда также может быть функцией, которую вы создали.
Из них в среде отладки Windows PowerShell ISE только точки останова строки могут быть установлены с помощью с помощью меню или горячих клавиш. Другие два типа точек останова могут быть установлены, но они устанавливаются на панели консоли с помощью Командлет Set-PSBreakpoint. Этот В разделе описывается, как выполнять задачи отладки в Windows PowerShell ISE с помощью меню. там, где это возможно, и выполнять более широкий набор команд на панели консоли с помощью сценариев.
Чтобы установить точку останова
Точку останова можно установить в сценарии только после его сохранения. Щелкните правой кнопкой мыши строку, в которой вы
хотите установить точку останова строки, а затем нажмите Toggle Breakpoint . Или щелкните строку, в которой вы
хотите установить точку прерывания строки и нажмите F9 или в меню Debug нажмите Toggle
Точка останова .
Следующий сценарий является примером того, как вы можете установить переменную точку останова из панели консоли с помощью с помощью Set-PSBreakpoint командлет.
# Эта команда устанавливает точку останова на переменной сервера в сценарии Sample.ps1. Set-PSBreakpoint -Script sample.ps1 -Variable Server
Список всех точек останова
Отображает все точки останова в текущем сеансе Windows PowerShell.
В меню Отладка щелкните Список точек останова . Следующий сценарий является примером того, как вы можете вывести список всех точек останова на панели консоли с помощью Командлет Get-PSBreakpoint.
# Эта команда выводит список всех точек останова в текущем сеансе. Get-PSBreakpoint
Удаление точки останова
Удаление точки останова удаляет ее.
Если вы думаете, что захотите использовать его позже, рассмотрите
Вместо этого отключите точку останова. Щелкните правой кнопкой мыши строку, в которой вы хотите
удалите точку останова и щелкните ToggleBreakpoint . Или щелкните строку, в которой вы хотите
удалите точку останова и в меню Debug щелкните Toggle Breakpoint . Следующий сценарий
пример того, как удалить точку останова с указанным идентификатором из панели консоли с помощью
Командлет Remove-PSBreakpoint.
# Эта команда удаляет точку останова с идентификатором точки останова 2. Удалить-PSBreakpoint-Id 2
Удалить все точки останова
Чтобы удалить все точки останова, определенные в текущем сеансе, в меню Отладка щелкните Удалить все Точки останова .
Следующий сценарий является примером того, как удалить все точки останова из панели консоли с помощью точка останова Remove-PSBreakpoint командлет.
# Эта команда удаляет все точки останова в текущем сеансе. Get-PSBreakpoint | Remove-PSBreakpoint
Отключение точки останова
Отключение точки останова не удаляет ее. Он отключает его, пока он не будет включен. Чтобы отключить
определенной точки останова строки, щелкните правой кнопкой мыши строку, в которой вы хотите отключить точку останова, а затем
нажмите Отключить точку останова .
Или щелкните строку, в которой вы хотите отключить точку останова, и нажмите F9 или на В меню «Отладка » щелкните «Отключить точку останова ». Следующий сценарий является примером того, как вы можете удалить точку останова с указанным идентификатором из панели консоли с помощью Командлет Disable-PSBreakpoint.
# Эта команда отключает точку останова с идентификатором точки останова 0. Disable-PSBreakpoint-Id 0
Отключить все точки останова
Отключение точки останова не удаляет ее; он выключает его, пока он не будет включен. Чтобы отключить все
точек останова в текущем сеансе, в меню Отладка щелкните Отключить все точки останова .
следующий сценарий является примером того, как вы можете отключить все точки останова на панели консоли с помощью
Disable-PSBreakpoint
командлет.
# Эта команда отключает все точки останова в текущем сеансе. # Вы можете сократить эту команду как: "gbp | dbp". Get-PSBreakpoint | Disable-PSBreakpoint
Включить точку останова
Чтобы включить определенную точку останова, щелкните правой кнопкой мыши строку, в которой вы хотите включить точку останова, и затем нажмите Включить точку останова . Или щелкните строку, в которой вы хотите включить точку останова, а затем нажмите F9 или в меню Debug щелкните Enable Breakpoint . Следующий сценарий пример того, как вы можете включить определенные точки останова из панели консоли с помощью Командлет Enable-PSBreakpoint.
# Эта команда включает точки останова с идентификаторами точек останова 0, 1 и 5. Enable-PSBreakpoint-Id 0, 1, 5
Включить все точки останова
Чтобы включить все точки останова, определенные в текущем сеансе, в меню Отладка выберите Включить все
Точки останова . Следующий сценарий является примером того, как вы можете включить все точки останова из
Панель консоли с помощью
Командлет Enable-PSBreakpoint.
# Эта команда включает все точки останова в текущем сеансе. # Вы можете сократить команду, используя их псевдонимы: "gbp | ebp". Get-PSBreakpoint | Enable-PSBreakpoint
Как управлять сеансом отладки
Перед началом отладки необходимо установить одну или несколько точек останова. Вы не можете установить точку останова, если сценарий, который вы хотите отладить, сохраняется. Инструкции по установке точки останова см. Как управлять точками останова или Set-PSBreakpoint. После Вас начать отладку, вы не сможете редактировать скрипт, пока не остановите отладку. Скрипт, содержащий один или несколько набор точек останова автоматически сохраняется перед запуском.
Чтобы начать отладку
Нажмите F5 или на панели инструментов щелкните значок Запустить сценарий или в меню Отладка нажмите Выполнить/Продолжить . Сценарий работает до тех пор, пока не встретит первую точку останова. Он делает паузу
операция там и выделяет строку, на которой она остановилась.
Чтобы продолжить отладку
Нажмите F5 или на панели инструментов щелкните значок Запустить сценарий или в меню Отладка ,
нажмите Выполнить/Продолжить или на панели консоли введите C
, а затем нажмите ENTER . Этот
заставляет сценарий продолжать выполнение до следующей точки останова или до конца сценария, если нет
встречаются дополнительные точки останова.
Для просмотра стека вызовов
В стеке вызовов отображается текущее место выполнения сценария. Если скрипт работает в
функция, которая была вызвана другой функцией, то она представлена на дисплее как
дополнительные строки в выводе. В самой нижней строке отображается исходный сценарий и строка в нем.
в котором была вызвана функция. Следующая строка показывает эту функцию и строку в ней, в которой
могла быть вызвана другая функция. Самая верхняя строка показывает текущий контекст текущего
строка, на которой установлена точка останова.
Во время паузы, чтобы увидеть текущий стек вызовов, нажмите CTRL + SHIFT + D или,
в меню Debug щелкните Display Call Stack или на панели консоли введите K
, а затем нажмите ВВЕДИТЕ .
Чтобы остановить отладку
Нажмите SHIFT + F5 или в меню Отладка щелкните Остановить отладчик или в меню
Панель консоли, введите Q
, а затем нажмите .ВВЕДИТЕ .
Как переходить, входить и выходить при отладке
Пошаговое выполнение — это процесс выполнения одного оператора за раз. Вы можете остановиться на строке кода и проверить значения переменных и состояние системы. В следующей таблице описаны общие отладка задач, таких как переход, вход и выход.
Задача отладки | Описание | Как это сделать в PowerShell ISE |
---|---|---|
Войдите внутрь | Выполняет текущую инструкцию, а затем останавливается на следующей инструкции.![]() | Нажмите F11 или в меню Debug щелкните Step Into или в панели консоли введите S и нажмите ENTER . |
Перешагнуть | Выполняет текущую инструкцию, а затем останавливается на следующей инструкции. Если текущий оператор является вызовом функции или скрипта, то отладчик выполняет всю функцию или скрипт целиком и останавливается на следующем операторе после вызова функции. | Нажмите F10 или в меню Debug щелкните Step Over или в панели консоли введите V и нажмите ENTER . |
Выход | Выход из текущей функции и переход на один уровень вверх, если функция вложена.![]() | Нажмите SHIFT + F11 , или в меню Отладка щелкните Выход , или в области консоли введите O и нажмите ENTER . |
Продолжить | : Продолжает выполнение до конца или до следующей точки останова. Пропущенные функции и вызовы выполняются, но не выполняются. | Нажмите F5 или в меню Отладка щелкните Выполнить/Продолжить или в области консоли введите C и нажмите ENTER . |
Как отображать значения переменных при отладке
Вы можете отображать текущие значения переменных в сценарии по мере выполнения кода.
Чтобы отобразить значения стандартных переменных
Используйте один из следующих способов:
На панели сценариев наведите указатель мыши на переменную, чтобы отобразить ее значение в виде всплывающей подсказки.
В области консоли введите имя переменной и нажмите ENTER .
Все панели в ISE всегда находятся в одной области. Поэтому, пока вы отлаживаете скрипт, команды, которые вы вводите на панели консоли, выполняются в области сценария. Это позволяет использовать консоль Панель для поиска значений переменных и функций вызова, которые определены только в скрипте.
Для отображения значений автоматических переменных
Вы можете использовать предыдущий метод для отображения значений почти всех переменных во время отладка скрипта. Однако эти методы не работают для следующих автоматических переменных.
$_
$Ввод
$MyInvocation
$PSBoundParameters
$Args
Если вы попытаетесь отобразить значение любой из этих переменных, вы получите значение этой переменной для in
внутренний конвейер, который использует отладчик, а не значение переменной в скрипте. Вы можете работать
вокруг этого для нескольких переменных (
$_
, $Input
, $MyInvocation
, $PSBoundParameters
и $Args
)
с помощью следующего метода:
В сценарии присвойте значение автоматической переменной новой переменной.
Показать значение новой переменной, либо наведя указатель мыши на новую переменную в скрипте или введя новую переменную на панели консоли.
Например, чтобы отобразить значение переменной $MyInvocation
, в сценарии присвойте значение
в новую переменную, например $scriptName
, а затем наведите указатель мыши или введите переменную $scriptName
, чтобы
отображать его значение.
# В C:\ps-test\MyScript.ps1 $scriptName = $MyInvocation.MyCommand.Path
# В панели консоли: .\MyScript.ps1 $scriptName
C:\ps-тест\MyScript.ps1
См. также
Изучение Windows PowerShell ISE
об отладчиках — PowerShell | Microsoft Learn
- Статья
- 15 минут на чтение
Краткое описание
Описывает отладчик PowerShell.
Подробное описание
Отладка — это процесс проверки сценария во время его и исправить ошибки в инструкциях скрипта. Отладчик PowerShell может помочь вы исследуете и выявляете ошибки и неэффективность в ваших сценариях, функциях, команды, конфигурации PowerShell Desired State Configuration (DSC) или выражения.
Начиная с PowerShell 5.0, отладчик PowerShell был обновлен для отладки
сценарии, функции, команды, конфигурации или выражения, которые выполняются
либо в консоли, либо в Windows PowerShell ISE на удаленных компьютерах. Ты можешь
запустить Enter-PSSession
для запуска интерактивного удаленного сеанса PowerShell в
которые вы можете установить точки останова и отладить файлы сценариев и команды на удаленном
компьютер. Функциональность Enter-PSSession
была обновлена, чтобы вы могли повторно подключиться
и войти в отключенный сеанс, в котором выполняется сценарий или команда на
удаленный компьютер. Если запущенный скрипт достигает точки останова, сеанс клиента
автоматически запускает отладчик. Если отключенный сеанс, который выполняется
скрипт уже достиг точки останова и останавливается в точке останова,
Enter-PSSession
автоматически запускает отладчик командной строки после того, как вы
повторно подключиться к сеансу.
Вы можете использовать функции отладчика PowerShell для проверки PowerShell сценарий, функцию, команду или выражение во время его выполнения. PowerShell отладчик включает в себя набор командлетов, позволяющих устанавливать точки останова, управлять точки останова и просмотреть стек вызовов.
Командлеты отладчика
Отладчик PowerShell включает следующий набор командлетов:
-
Set-PSBreakpoint
: Устанавливает точки останова в строках, переменных и командах. -
Get-PSBreakpoint
: Получает точки останова в текущем сеансе. -
Disable-PSBreakpoint
: отключает точки останова в текущем сеансе. -
Enable-PSBreakpoint
: повторно включает точки останова в текущем сеансе. -
Remove-PSBreakpoint
: Удаляет точки останова из текущего сеанса. -
Get-PSCallStack
: Отображает текущий стек вызовов.
Запуск и остановка отладчика
Чтобы запустить отладчик, установите одну или несколько точек останова. Затем запустите скрипт, команду или функцию, которую вы хотите отладить.
При достижении точки останова выполнение останавливается, и управление передается отладчик.
Чтобы остановить отладчик, запустите сценарий, команду или функцию, пока они не будут
полный. Или введите стоп
или t
.
Команды отладчика
При использовании отладчика в консоли PowerShell используйте следующие команды для контроля исполнения. В интегрированной среде сценариев Windows PowerShell используйте команды на панели отладки. меню.
Примечание. Для получения информации об использовании отладчика в других хост-приложениях см. см. документацию хост-приложения.
s
,StepInto
: Выполняет следующую инструкцию и затем останавливается.v
,StepOver
: Выполняет следующий оператор, но пропускает функции и призывы. Пропущенные операторы выполняются, но не выполняются.Ctrl+Break
: (Разбить все в ISE) Прерывает выполнение сценария внутри консоль PowerShell или Windows PowerShell ISE. Обратите внимание, что Ctrl + Перерыв в Windows PowerShell 2.0, 3.0 и 4.0 закрывает программу. Break All работает как локально, так и удаленно интерактивные сценарии.o
,StepOut
: Выход из текущей функции; вверх на один уровень, если они вложены. Если в основном теле он продолжается до конца или до следующей точки останова. Пропущенный операторы выполняются, но не выполняются.c
,Продолжить
: Продолжать работу до завершения сценария или до достигнута следующая точка останова.Пропущенные операторы выполняются, но не перешагнул через.
l
,Список
: Отображает выполняемую часть скрипта. По умолчанию, он отображает текущую строку, пять предыдущих строк и 10 последующих строк. Чтобы продолжить вывод сценария, нажмите ENTER.л <м>
,Список
: Отображает 16 строк сценария, начиная со строки номер, указанныйl
,Список
: Отображаетq
,Стоп
,Выход
: Прекращение выполнения скрипта и выход из отладчика. Если вы отлаживаете задание, запускаяКомандлет Debug-Job
, командаExit
отключает отладчик и позволяет продолжить выполнение задания.k
,Get-PsCallStack
: отображает текущий стек вызовов.?
,h
: Отображает справку по команде отладчика.
Чтобы выйти из отладчика, вы можете использовать Stop (q).
Начиная с PowerShell 5.0, вы можете запустить команду Exit, чтобы выйти из
вложенный сеанс отладки, который вы начали, запустив Debug-Job
или Отладка-пространство выполнения
.
Используя эти команды отладчика, вы можете запустить сценарий, остановившись в точке озабоченность, исследовать значения переменных и состояние системы, а также продолжайте выполнять сценарий, пока не обнаружите проблему.
ПРИМЕЧАНИЕ. Если вы входите в оператор с оператором перенаправления, например «>», отладчик PowerShell перебирает все оставшиеся операторы сценария.
Отображение значений переменных сценария
Пока вы находитесь в отладчике, вы также можете вводить команды, отображать значение
переменных, использовать командлеты и запускать сценарии в командной строке.
Вы можете отобразить текущее значение всех переменных в скрипте, который выполняется отлажено, за исключением следующих автоматических переменных:
$_ $Аргс $Ввод $MyInvocation $PSBoundParameters
Если вы попытаетесь отобразить значение любой из этих переменных, вы получите значение эта переменная для внутреннего конвейера, которую использует отладчик, а не значение переменная в скрипте.
Чтобы отобразить значение этих переменных для отлаживаемого скрипта, в скрипт, присвойте значение автоматической переменной новой переменной. Затем вы можете отобразить значение новой переменной.
Например,
$scriptArgs = $Args $scriptArgs
В примере в этом разделе значение переменной $MyInvocation
равно
переназначается следующим образом:
$scriptname = $MyInvocation.MyCommand.Path
Среда отладчика
При достижении точки останова вы входите в среду отладчика. Команда
запросить изменения, чтобы они начинались с «[DBG]:».
Дополнительные сведения о настройке подсказки см. в разделе about_Prompts.
Кроме того, в некоторых хост-приложениях, таких как консоль PowerShell (но не в Windows PowerShell Integrated Scripting Environment [ISE]), вложенная подсказка открывается для отладки. Вы можете обнаружить вложенную подсказку по повторяющемуся символов больше (ASCII 62), которые появляются в командной строке.
Например, следующее приглашение отладки по умолчанию в PowerShell консоль:
[DBG]: PS (get-location)>>>
Уровень вложенности можно найти с помощью $NestedPromptLevel
автоматического
переменная.
Кроме того, в локальном
объем. Вы можете использовать переменную $PsDebugContext
для определения
находитесь ли вы в отладчике.
Например:
if ($PSDebugContext) {"Отладка"} else {"Не отладка"}
Вы можете использовать значение переменной $PSDebugContext
при отладке.
[DBG]: PS>>> $PSDebugContext.InvocationInfo Имя CommandLineParameters UnboundArguments Местоположение ---- -------------------- ---------------- -------- = {} {} C:\ps-test\vote.ps1 (1)
Отладка и область действия
Взлом отладчика не меняет области действия, в которой вы находитесь работает, но когда вы достигаете точки останова в сценарии, вы переходите в область сценария. Область сценария является дочерней областью, в которой вы запустили скрипт. отладчик.
Чтобы найти переменные и псевдонимы, определенные в области сценария, используйте
Параметр области действия командлетов Get-Alias
или Get-Variable
.
Например, следующая команда получает переменные в локальном (скрипт) область:
Get-Variable-scope 0
Вы можете сократить команду как:
gv -s 0
Это полезный способ увидеть только те переменные, которые вы определили в скрипте. и что вы определили во время отладки.
Отладка в командной строке
Когда вы устанавливаете переменную точку останова или точку останова команды, вы можете установить
точка останова только в файле скрипта. Однако по умолчанию точка останова установлена на
все, что выполняется в текущем сеансе.
Например, если установить точку останова на переменной $name
, отладчик
прерывается на любой переменной $name
в любом сценарии, команде, функции, командлете сценария
или выражение, которое вы запускаете, пока не отключите или не удалите точку останова.
Это позволяет отлаживать сценарии в более реалистичном контексте, в котором они могут быть затронуты функциями, переменными и другими сценариями в сеансе и в профиле пользователя.
Точки останова строки характерны для файлов скриптов, поэтому они устанавливаются только в скрипте файлы.
Функции отладки
При установке точки останова на функции, имеющей Начало
, Процесс
и Конец
разделы, отладчик прерывается на первой строке каждого раздела.
Например:
function test-cmdlet { начинать { запись-вывод "Начало" } процесс { запись-вывод "Процесс" } конец { запись-вывод "Конец" } } C:\PS> Set-PSBreakpoint -команда test-cmdlet C:\PS> тестовый командлет Начинать Вход в режим отладки.Используйте ч или ? для помощи. Нажмите точку останова команды на «приглашение: тест-командлет» тестовый командлет [DBG]: C:\PS> c Процесс Вход в режим отладки. Используйте ч или ? для помощи. Нажмите точку останова команды на «приглашение: тест-командлет» тестовый командлет [DBG]: C:\PS> c Конец Вход в режим отладки. Используйте ч или ? для помощи. Нажмите точку останова команды на «приглашение: тест-командлет» тестовый командлет # [ДБГ]: C:\PS>
Отладка удаленных сценариев
Начиная с PowerShell 5.0, вы можете запускать отладчик PowerShell в
удаленный сеанс либо в консоли, либо в Windows PowerShell ISE. Функциональность Enter-PSSession
была обновлена, чтобы вы могли повторно подключаться и
войти в отключенный сеанс, работающий на удаленном компьютере, и
в данный момент работает скрипт. Если работающий скрипт достигает точки останова, ваш
клиентский сеанс автоматически запускает отладчик.
Ниже приведен пример, показывающий, как это работает, с точками останова, установленными в
скрипт в строках 6, 11, 22 и 25. Обратите внимание, что в примере, когда
запустится отладчик, появятся две идентифицирующие подсказки: имя компьютера на
которой запущен сеанс, и подсказка DBG, которая сообщает, что вы находитесь в
режим отладки.
Enter-Pssession -Cn локальный хост [localhost]: PS C:\psscripts> Set-PSBreakpoint .\ttest19.ps1 6,11,22,25 Переменная команды строки сценария ID Действие -- ------ ---- ------- -------- ------ 0 ttest19.ps1 6 1 ttest19.ps1 11 2 ttest19.ps1 22 3 ttest19.ps1 25 [localhost]: PS C:\psscripts> .\ttest19.ps1 Нажмите точку останова строки на «C:\psscripts\ttest19.ps1:11» В C:\psscripts\ttest19.ps1:11 символ:1 + $winRMName = "WinRM" # + ~ [localhost]: [DBG]: PS C:\psscripts>> список 6:1..5 | foreach { спать 1; Запись-вывод "hello2day $_" } 7: } № 8: 9: $количество = 10 10: $psName = "PowerShell" 11:* $winRMName = "WinRM" 12: $myVar = 102 № 13: 14: for ($i=0; $i -lt $count; $i++) 15: { 16: спать 1 17: Запись-вывод «Итерация цикла: $i» 18: Запись-вывод "MyVar is $myVar" № 19: 20: привет2день № 21: [localhost]: [DBG]: PS C:\psscripts>> переход В C:\psscripts\ttest19.ps1:12 символ:1 + $myVar = 102 # + ~ [localhost]: [DBG]: PS C:\psscripts>> выйти [localhost]: PS C:\psscripts> Exit-PSSession PS C:\psscripts>
Примеры
Этот тестовый сценарий определяет версию операционной системы и отображает системное сообщение. Он включает в себя функцию, вызов функции и переменная.
Следующая команда отображает содержимое файла тестового сценария:
PS C:\PS-test> Get-Content test.ps1 функция PSверсия { "PowerShell" + $PSVersionTable.PSVersion если ($PSVersionTable.PSVersion.Major -lt 6) { «Обновите до PowerShell 6.0!» } еще { «Вы запускали фоновое задание сегодня (начало задания)?» } } $scriptName = $MyInvocation.MyCommand.Path PSверсия "Готово $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 ).
Столбец: 0 Линия 1 Действие : Включено: правда Количество попаданий : 0 Идентификатор: 0 Скрипт: C:\ps-test\test.ps1 Имя сценария : C:\ps-test\test.ps1
Теперь запустите скрипт.
PS C:\ps-test> .\test.ps1
Когда сценарий достигает первой точки останова, сообщение о точке останова указывает что отладчик активен. Он описывает точку останова и предварительно просматривает первую строка скрипта, которая является объявлением функции. Командная строка также изменяется, чтобы указать, что отладчик имеет управление.
Строка предварительного просмотра включает имя сценария и номер строки просматриваемого команда.
Вход в режим отладки. Используйте ч или ? для помощи. Нажмите точку останова строки на «C:\ps-test\test.ps1:1» test.ps1:1 функция psversion { # ДБГ>
Используйте пошаговую команду (команды) для выполнения первого оператора в сценарии и для
Предварительный просмотр следующего утверждения. Следующий оператор использует $MyInvocation
автоматическая переменная для установки значения переменной $scriptName
на путь
и имя файла сценария.
ДБГ> с test.ps1:11 $scriptName = $MyInvocation.MyCommand.Path
На данный момент переменная $scriptName
не заполнена, но вы можете проверить
значение переменной, отображая ее значение. В этом случае значение равно $нуль
.
БД> $имя_сценария # ДБГ>
Используйте другую пошаговую команду (команды) для выполнения текущего оператора и предварительного просмотра следующий оператор в сценарии. Следующий оператор вызывает PsVersion функция.
ДБГ> с test.ps1:12 psверсия
В этот момент переменная $scriptName
заполнена, но вы проверяете
значение переменной, отображая ее значение. В этом случае устанавливается значение
к пути сценария.
БД> $scriptName C:\ps-тест\test.ps1
Используйте другую пошаговую команду для выполнения вызова функции. Нажмите ENTER или введите «s» для шага.
ДБГ> с test.ps1:2 "PowerShell" + $PSVersionTable.PSVersion
Отладочное сообщение содержит предварительный просмотр инструкции в функции. К
выполнить этот оператор и просмотреть следующий оператор в функции, вы
можно использовать Команда шага
. Но в этом случае используйте команду StepOut (o). Это
завершает выполнение функции (если она не достигает точки останова) и
шагов к следующему оператору в сценарии.
ДБГ> о Windows PowerShell 2.0 Запускали ли вы фоновое задание сегодня (стартовое задание)? test.ps1:13 "Готово $scriptName"
Поскольку мы находимся на последнем операторе сценария, шаги Step, StepOut и Команды продолжения имеют тот же эффект. В этом случае используйте StepOut (o).
Готово C:\ps-test\test.ps1 PS C:\ps-тест>
Команда StepOut выполняет последнюю команду. Стандартная командная строка указывает, что отладчик завершил работу и вернул управление команде процессор.
Теперь снова запустите отладчик. Во-первых, чтобы удалить текущую точку останова, используйте
Командлеты Get-PsBreakpoint
и Remove-PsBreakpoint
. (Если вы думаете, что можете
повторно использовать точку останова, используйте командлет Disable-PsBreakpoint
вместо Remove-PsBreakpoint
.)
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
Вы можете сократить эту команду как:
PS C:\ps-test> gbp | рбп
Или запустите команду, написав функцию, например следующую функция:
функция delbr { gbp | рбп }
Теперь создайте точку останова для переменной $scriptname
.
PS C:\ps-test> Set-PSBreakpoint -variable scriptname -script test.ps1
Команду можно сократить следующим образом:
PS C:\ps-test> sbp -v scriptname -s test.ps1
Теперь запустите сценарий. Сценарий достигает переменной точки останова. По умолчанию режим записи, поэтому выполнение останавливается непосредственно перед оператором, который изменяет значение переменной.
PS C:\ps-test> .\test.ps1 Нажмите переменную точку останова на «C:\ps-test\test.ps1:$scriptName» (доступ для записи) test.ps1:11 $scriptName = $MyInvocation.MyCommand.Path # ДБГ>
Показать текущее значение переменной $scriptName
, равное $null
.
БД> $scriptName # ДБГ>
Используйте пошаговую команду (команды) для выполнения инструкции, заполняющей переменную.
Затем отобразите новое значение переменной $scriptName
.
БД> $scriptName C:\ps-тест\test.ps1 ``PowerShell Используйте пошаговую команду (команды) для предварительного просмотра следующего оператора в сценарии. ``PowerShell ДБГ> с test.ps1:12 psверсия
Следующим оператором является вызов функции PsVersion. Чтобы пропустить функцию
но все же выполнить его, используйте команду StepOver (v). Если вы уже находитесь в
функция при использовании StepOver не эффективна. Вызов функции
отображается, но не выполняется.
ДБГ> v Windows PowerShell 2.0 Запускали ли вы фоновое задание сегодня (стартовое задание)? test.ps1:13 "Готово $scriptName"
Команда StepOver выполняет функцию и просматривает следующую инструкцию в скрипте, который печатает последнюю строку.
Используйте команду Stop (t) для выхода из отладчика. Командная строка возвращается к стандартная командная строка.
C:\ps-тест>
Чтобы удалить точки останова, используйте Get-PsBreakpoint
и Remove-PsBreakpoint
командлеты.
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 psверсия # ДБГ>
Сценарий достигает точки останова при вызове функции. В этот момент
функция еще не вызывалась. Это дает вам возможность использовать
Параметр действия Set-PSBreakpoint
для установки условий выполнения
точки останова или для выполнения подготовительных или диагностических задач, таких как запуск
журнал или вызов сценария диагностики или безопасности.
Чтобы задать действие, используйте команду «Продолжить» (c) для выхода из сценария, а Команда Remove-PsBreakpoint
для удаления текущей точки останова. (Контрольные точки
доступны только для чтения, поэтому вы не можете добавить действие к текущей точке останова.)
ДБГ> с Windows PowerShell 2.0 Запускали ли вы фоновое задание сегодня (стартовое задание)? Готово C:\ps-test\test.ps1 PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint PS C:\ps-тест>
Теперь создайте новую точку останова команды с действием. Следующие команды устанавливают
точка останова команды с действием, которое регистрирует значение
$scriptName
переменная при вызове функции. Поскольку ключевое слово Break не используется в
действие, выполнение не останавливается. (обратная галочка ( `
) является
символ продолжения строки.)
PS C:\ps-test> Set-PSBreakpoint -command psversion -script test.ps1 ` -action { add-content "Значение `$scriptName равно $scriptName." ` -path action.log}
Вы также можете добавить действия, устанавливающие условия для точки останова. в
следующей команды, точка останова команды выполняется, только если выполнение
установлена политика RemoteSigned, самая ограничительная политика, которая по-прежнему разрешает
вам запускать скрипты. (обратная галочка ( `
) является символом продолжения.)
PS C:\ps-test> Set-PSBreakpoint -script test.ps1 -command psversion ` -action { if ((Get-ExecutionPolicy) -eq "RemoteSigned") { break }}
Ключевое слово Break в действии указывает отладчику выполнить точку останова. Вы также можете использовать ключевое слово Continue, чтобы заставить отладчик выполняться без
ломать. Поскольку ключевое слово по умолчанию — «Продолжить», необходимо указать «Разрыв», чтобы
остановить выполнение.
Теперь запустите скрипт.
PS C:\ps-test> .\test.ps1 Нажмите точку останова команды на «C:\ps-test\test.ps1:psversion» test.ps1:12 psверсия
Поскольку для политики выполнения задано значение RemoteSigned , выполнение останавливается в вызов функции.
В этот момент вы можете проверить стек вызовов. Использовать Командлет Get-PsCallStack
или команда отладчика Get-PsCallStack
(k).
следующая команда получает текущий стек вызовов.
ДБГ> к 2: подсказка 1: .\test.ps1: $args=[] 0: подсказка: $args=[]
В этом примере показаны лишь некоторые из многих способов использования PowerShell. отладчик.
Для получения дополнительных сведений о командлетах отладчика введите следующую команду:
help <имя-командлета> -full
Например, введите:
help Set-PSBreakpoint -full
Другие функции отладки в PowerShell
Помимо отладчика PowerShell, PowerShell включает несколько других
функции, которые можно использовать для отладки скриптов и функций.