Отслеживание вашего пути через сложный сценарий PowerShell

Опубликовано: 14 Марта, 2023
Отслеживание вашего пути через сложный сценарий PowerShell

За эти годы я написал несколько очень сложных сценариев PowerShell , как для личного использования, так и для некоторых статей, которые я пишу на этом сайте . Хотя у этих типов сценариев есть свое место, их может быть чрезвычайно сложно отлаживать . Это может быть особенно актуально для сценариев, содержащих множество функций или множество логических вентилей .

Вы можете упростить процесс отладки с помощью команды Set-PSDebug . В этой статье я хочу показать вам технику отслеживания выполнения скрипта.

Во-первых, давайте начнем с командлета Set-PSDebug и того, как мы можем использовать его для отслеживания хода выполнения скрипта во время выполнения.

Командлет Set-PSDebug

Командлет Set-PSDebug прост в использовании, но он может быть бесценным инструментом для выяснения того, что делает ваш скрипт . Вы можете использовать его, чтобы понять, почему он не работает так, как вы ожидали.

Настройка уровня трассировки

При использовании командлета Set-PSDebug вам необходимо указать PowerShell, какой уровень трассировки вы хотите использовать. Чтобы указать уровень трассировки, добавьте параметр -Trace к командлету Set-PSDebug . Вам также потребуется добавить число, отражающее уровень трассировки, который вы хотите использовать. Допустимые уровни трассировки включают:

  1. Трассировка отключена.
  1. Используется базовая трассировка, и PowerShell отображает номер выполняемой строки.
  2. В дополнение к отслеживанию номеров строк PowerShell также отслеживает присвоения переменных и вызовы функций. Он также может вызывать внешние скрипты.

Выполнение базовой трассировки

Вы можете отслеживать код из любого сеанса PowerShell. В этой статье я буду использовать PowerShell ISE , потому что это немного упрощает просмотр снимков экрана. Чтобы выполнить базовую трассировку скрипта:

  1. Откройте сеанс PowerShell .
  2. Выполните следующую команду: Set-PSDebug -Trace 1
  3. Запустите свой скрипт .
Изображение 4132
Сценарий отображается в верхней половине окна, а его след — в нижней половине.

Если вы посмотрите на изображение выше, вы увидите, что я открыл сценарий в PowerShell ISE , а затем выполнил базовую трассировку этого сценария . В этом случае сценарий начинается с функции, поэтому первой строкой кода , которая будет выполняться, будет строка 6 , которая вызывает функцию. Обратите внимание, что в трассировке используется слово Debug для отображения информации об отладчике. Затем он отображает номер строки; 6 в данном случае. Инструкция добавляется в эту строку.

После вызова функции трассировка показывает , что сценарий выполняет строку 2; открывающая скобка. После этого в строке 3 присутствует оператор Write-Host. В строке 4 закрывающая скобка. При выполнении строки 3 PowerShell не показывает номер строки и команду. Он также отображает вывод , который генерируется этой строкой кода. Здесь выводом является текст, который говорит: «Я что-то делаю».

Выполнение более полной трассировки

Теперь, когда вы знаете, как выполнить базовую трассировку, давайте выполним более полную. Процесс точно такой же, как и раньше , за исключением того, что на этот раз нам нужно установить уровень трассировки на 2 . Таким образом, команда Set-PSDebug будет выглядеть так: Set-PSDebug -Trace 2 .

Изображение 4133
Так выглядит трассировка уровня 2.

Обратите внимание, что я добавил в функцию две строки кода ; строки 4 и 5 . Обе строки здесь являются присвоениями переменных. Они ничего не делают в отношении функциональности скрипта. Я поместил их туда только для того, чтобы показать вам, как работает трассировка присваивания переменных .

Тем не менее, вы заметите, что информация трассировки похожа на то, что вы видели раньше. На этот раз вы также заметите, что в выходных данных трассировки указана работающая функция . Если вы посмотрите на результаты трассировки, вы увидите, что PowerShell также возвращает переменную $A . Вы можете увидеть строку назначения переменной и значение, которое фактически было присвоено переменной.

Последние мысли

Длинные или сложные сценарии PowerShell могут быть трудны для отладки , но командлет Set-PSDebug значительно упрощает процесс отладки. Трассировка уровня 1 показывает выполнение строк последовательности, а трассировка уровня 2 также показывает присвоение переменных и вызовы функций.

Часто задаваемые вопросы

Считает ли PowerShell пустые строки, когда трассировка сообщает номера строк?

Да, пустые строки рассматриваются как строки кода . Если сценарий PowerShell содержит четыре строки, пустую строку, а затем еще одну строку кода, то пустая строка будет считаться строкой 5. Это никогда не будет выполнено, поскольку оно пустое, а последняя строка имеет номер 6.

Если трассировка уровня 2 PowerShell дает более подробные выходные данные, есть ли смысл выполнять трассировку уровня 1?

Иногда трассировка PowerShell уровня 2 может дать слишком много информации для обработки. Если вы стремитесь к простоте, вы можете начать с трассировки уровня 1 и посмотреть, к чему это приведет.

Как отключить трассировку PowerShell, когда закончите?

Установите уровень трассировки на 0 , введя: Set-PSDebug -Trace 0 в свой сценарий PowerShell . Это помогает предотвратить выполнение ненужных задач, которые снижают производительность вашей системы. Если у вас включено ведение журнала , остановите заполнение вашей системы файлами журнала, отключив их одновременно. Если вы забудете отключить журналы, это может привести к падению системы из-за заполнения хранилища.

Поддерживает ли командлет PowerShell Set-PSDebug другие параметры?

Используйте параметр -Step в PowerShell. Добавление этого в командлет Set-PSDebug приводит к тому, что сценарий приостанавливается после каждой строки и ждет разрешения на выполнение следующей строки кода. Параметр -Strict запускает строгий режим. Это останавливает скрипт, если что-то не работает корректно.

Что вы можете сделать, если Set-PSDebug создает вывод, который прокручивается за пределы экрана PowerShell?

Если Set-PSDebub создает длинный вывод, вы можете сбросить вывод в файл, создав расшифровку. К сожалению, вы не можете изменить терминал в соответствии с выходной длиной. Это сделано намеренно и является частью кода, частью функции безопасности, которую предлагает PowerShell.