Эхо-эквивалент в PowerShell для тестирования скриптов


233

Я хотел бы выводить переменные и значения в сценарии PowerShell , устанавливая флаги и просматривая данные в течение всего сценария.

Как бы я это сделал?

Например, что будет PowerShell эквивалентно следующему коду PHP?

echo "filesizecounter: " . $filesizecounter 

Проверьте скрипт-редактор / отладчик, который поставляется с PowerGUI . Это может подойти для того, что вы делаете. Я понимаю, что Powershell 2 поставляется с отладчиком (но я не пробовал).
Дан-г-н

Ответы:


275

Есть несколько способов:

Write-Host: Запись напрямую в консоль, не включается в вывод функции / командлета. Позволяет установить цвет переднего плана и фона.

Write-Debug: Запись напрямую в консоль, если $DebugPreferenceустановлено значение «Продолжить» или «Стоп».

Write-Verbose: Запись напрямую в консоль, если $VerbosePreferenceустановлено значение «Продолжить» или «Стоп».

Последний предназначен для дополнительной необязательной информации, Write-Debugдля отладки (так что, похоже, подходит в этом случае).

Дополнительно : в сценариях PSH2 (по крайней мере), использующих привязку командлетов, автоматически получаются параметры -Verboseи -Debugпереключаются, локально включаются Write-Verboseи Write-Debug(то есть переопределяются переменные предпочтения), как это делают скомпилированные командлеты и поставщики.


4
Хорошая вещь о Write-Debug и Write-Verbose заключается в том, что вы можете оставить свои операторы отладки в своем коде и просто включить вывод, когда вам это нужно, используя соответствующую переменную предпочтения. Экономит время и является хорошей функцией для других пользователей ваших функций.
JasonMArcher

5
Вы также хотите ознакомиться с Out-String, потому что с любым нетривиальным объектом вам необходимо использовать его для преобразования объекта в отображаемую строку перед использованием любого из этих трех командлетов Write- *.
Jaykul

113

У Powershell есть эхо-отображение сопоставления псевдонимов Write-Output, поэтому:

echo "filesizecounter : $filesizecounter"


7
echoявляется псевдонимом Write-Outputв соответствии с TechNet Microsoft и обсуждается здесь
Гленн Лоуренс

2
Спасибо Гленн, похоже, что псевдоним был переназначен за 6 лет, с тех пор как я это опубликовал. Что хорошо, на самом деле не следует использовать Write-Host, поскольку он обходит конвейер. Я обновил свой ответ, чтобы указать это. Спасибо!
Джастин Р.

3
Почему бы вам не захотеть обойти конвейер, если все, что вам нужно сделать, это вывести вывод «debug» на консоль, чтобы отслеживать выполнение скрипта? Write-Output имеет странный побочный эффект, когда содержимое последнего вызова Write-Output будет оставлено в стеке, переопределяя любую переменную, которую вы пытаетесь явно вернуть из функции. Подобные побочные эффекты ощущаются как ужасно странный способ поведения языка.
Крейг

33

PowerShell интерполирует, не так ли?

В PHP

echo "filesizecounter: " . $filesizecounter 

также может быть записано как:

echo "filesizecounter: $filesizecounter" 

В PowerShell что-то вроде этого должно соответствовать вашим потребностям:

Write-Host "filesizecounter: $filesizecounter"

9
PHP не имеет ничего общего с этим вопросом
reggaeguitar


14

Безусловно, самый простой способ отобразить в powershell - просто создать строковый объект и позволить конвейеру вывести его:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

Конечно, вы отказываетесь от некоторой гибкости, когда не используете методы Write- *.


9

echo является псевдонимом Write-Output, хотя выглядит так же, как Write-Host .

Не в чем разница между echo и Write-Host в PowerShell? ,

echo - псевдоним для Write-Output, который записывает в поток вывода Success. Это позволяет обрабатывать вывод через конвейеры или перенаправлять в файлы. Write-Host пишет напрямую в консоль, поэтому вывод не может быть перенаправлен / обработан дальше.



5

Я не знаю, разумно ли это делать, но вы можете просто написать

"filesizecounter: " + $filesizecounter

И это должно вывести:

filesizecounter: value


1
"filesizecounter: $filesizecounter"еще короче.
Jiggunjer

3

PowerShell имеет псевдонимы для нескольких общих команд, таких как echo. Введите в PowerShell следующее:

Get-Alias echo

чтобы получить ответ:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           echo -> Write-Output

Даже у Get-Alias ​​есть псевдоним gal -> Get-Alias. Вы можете написать, gal echoчтобы получить псевдоним для echo.

gal echo

Другие псевдонимы перечислены здесь: https://docs.microsoft.com/en-us/powershell/scripting/learn/using-familiar-command-names?view=powershell-6

cat dir mount rm cd echo move rmdir chdir erase popd sleep clear h ps sort cls history pushd tee copy kill pwd type del lp r write diff ls ren


2

Попробуйте, Get-Content .\yourScript.PS1и вы увидите содержание вашего сценария.

также вы можете вставить эту строку в код вашего скрипта:

get-content .\scriptname.PS1
script code
script code

....


Не показывает обработанные фактические значения (например, подстановка env var), поэтому не является ответом на заданный вопрос.
iisystems

0

Также следует отметить, что Set-PSDebug похож на командную команду старой школы echo on:

Set-PSDebug -Trace 1

Эта команда приведет к отображению каждой строки исполняемого скрипта:

Когда Traceпараметр имеет значение 1, каждая строка скрипта отслеживается при его запуске. Когда параметр имеет значение 2, присваиваются переменные, вызовы функций и вызовы сценариев. Если указан параметр Step, вам будет предложено выполнить каждую строку сценария.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.