С PowerShell, как я могу получить вывод Write-Debug на консоль?

Я изучаю PowerShell и использую Write-Host для проверки назначения переменных в новом файле сценария PowerShell. Затем я прочитал статью, в которой говорилось, что это плохая идея.

Итак, в моем файле .ps1 я заменил утверждения следующим образом:

Write-Host "Start"
Write-Host "End"

... с этим:

Write-Debug "Start"
Write-Debug "End"

Но когда я запустил сохраненный скрипт в Windows PowerShell ISE, на консоль не было выведено ничего. Я -debug к утверждению, которое вызывает скрипт, примерно так:

PS E:\trialrun> .\MyScript.ps1 -debug

Но опять же, вывод не записывается на консоль. Видимо я неправильно использую Write -debug. Как я могу получить выходные данные отладки для записи на консоль?

Ответ 1

ТЛ; др:

  • Запустите $DebugPreference = 'Continue', чтобы начать видеть результат вызовов Write-Debug.

  • Когда вы закончите, восстановите предпочтительную переменную $DebugPreference в значение по умолчанию, используя $DebugPreference = 'SilentlyContinue'


Печатается ли вывод из операторов Write-Debug, управляется двумя механизмами:

  • Во всей области: по значению предпочтительной переменной $DebugPreference - см. Get-Help about_Preference_Variables.

  • Специальная область команд, при вызове командлета или расширенного сценария/функции (которая переопределяет значение $DebugPreference) с общим параметром -Debug - см. Get-Help about_CommonParameters.

$DebugPreference по умолчанию - SilentlyContinue, что объясняет, почему вы не видите никаких выводов из операторов Write-Debug по умолчанию.

Когда вы используете общий параметр -Debug, вы фактически устанавливаете $DebugPreference только для вызываемой команды, а в Windows PowerShell вы неизменно устанавливаете для него значение Inquire, который не только печатает Write-Debug сообщения, но и делает паузу при каждом таком утверждении, чтобы спросить, как вы хотите продолжить.
В PowerShell Core (v6+) теперь это значение (более разумно) установлено на Continue.

  • Чтобы пользовательский сценарий или функция поддерживали общий параметр -Debug, он должен быть расширенным, объявленным с атрибутом [CmdletBinding()] для его блока param(), как ответ матиаса показывает.

Поскольку в Windows PowerShell такое поведение "подсказка при каждом" Write-Debug -call может быть разрушительным, лучше подойдет $DebugPreference = 'Continue'. Как уже говорилось, в PowerShell Core (v6+) это больше не является проблемой.

Ответ 2

Вам понадобится атрибут CmdletBinding в script, если вы хотите поддерживать общие параметры (включая -Debug):

[CmdletBinding()]
param()

Write-Debug Start
Write-Debug End

Я бы предложил просмотреть файл справки about_Functions_CmdletBindingAttribute

Ответ 3

Я использую Write-Output вместо Write-Host, и это выводится на консоль. Write-Verbose - это еще один вариант.

См. Эту статью для получения дополнительной информации: Write-Host считается вредным

Мне сообщили, что мой подход плохой. Пожалуйста, смотрите комментарии ниже по причинам, почему.