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

233

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

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

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

echo "filesizecounter: " . $filesizecounter 
Phill
источник
Проверьте скрипт-редактор / отладчик, который поставляется с 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
25
Write-Host "filesizecounter : " $filesizecounter 
женское бесплодие
источник
14

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

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

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

Goyuix
источник
9

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

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

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

Пол Фийма
источник
8

Write-host работает нормально.

$Filesize = (Get-Item $filepath).length;
Write-Host "FileSize= $filesize";
Али Дараби
источник
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, вам будет предложено выполнить каждую строку сценария.

lauxjpn
источник