Я запускаю сценарий PowerShell из командного файла. Сценарий извлекает веб-страницу и проверяет, является ли содержимое страницы строкой «ОК».
Сценарий PowerShell возвращает уровень ошибки пакетному сценарию.
Пакетный скрипт выполняется ScriptFTP , программой автоматизации FTP. Если возникает ошибка, я могу сделать так, чтобы ScriptFTP отправлял всю консольную информацию администратору по электронной почте.
В сценарии PowerShell я хотел бы вывести возвращаемое значение с веб-сайта, если оно не «ОК», поэтому сообщение об ошибке включается в вывод консоли и, следовательно, в сообщение о состоянии.
Я новичок в PowerShell и не уверен, какую функцию вывода использовать для этого. Я вижу три:
- Написать-Host
- Write-Output
- Write-Error
Что было бы правильным для записи в эквивалент Windows stdout
?
источник
"Hello, World!" | Out-Host
.Out-Host
с другой стороны, отправляет объекты на хост PowerShell для отображения, и его реализация зависит от хоста. Консольный хост отправляет их на стандартный дескриптор вывода (проходяOut-Default
по пути), действительно. Однако PowerShell ISE отображает их в своей области вывода, а другие хосты могут делать и другие вещи полностью.Get-ChildItem
, например, что выходные данные представлены в виде таблицы, а результаты со многими свойствами (например, WMI) установлены по умолчаниюFormat-List
.Я думаю, что в этом случае вам понадобится Write-Output .
Если у вас есть сценарий, как
затем, если вы вызовете скрипт с перенаправленным выводом, что-то вроде
yourscript.ps1 > out.txt
, вы попадетеtest2
на экранtest1\ntest3\n
в «out.txt».Обратите внимание, что «test3» и строка «Запись-вывод» всегда будут добавлять новую строку к вашему тексту, и в PowerShell нет способа остановить это (то есть
echo -n
это невозможно в PowerShell с собственными командами). Если вам нужна функциональность (довольно простая и простая в Bash ),echo -n
посмотрите ответ samthebest .Если командный файл запускает команду PowerShell, он, скорее всего, захватит команду Write-Output. У меня были «долгие дискуссии» с системными администраторами о том, что следует записывать в консоль, а что нет. Теперь мы согласились с тем, что единственная информация, если сценарий успешно выполнен или умер, должна быть
Write-Host
отредактирована, и все, что может понадобиться автору сценария, должно быть известно о выполнении (какие элементы были обновлены, какие поля были установлены и т. Д.) Записать-Вывести. Таким образом, когда вы отправляете скрипт системному администратору, он может легкоrunthescript.ps1 >someredirectedoutput.txt
и на экране увидеть, все ли в порядке. Затем отправьте «someredirectedoutput.txt» разработчикам.источник
Я думаю, что следующее - хорошая выставка Echo vs. Write-Host . Обратите внимание, как test () на самом деле возвращает массив целых чисел, а не единственное целое число, как можно легко поверить.
Терминал выхода из вышеупомянутого:
источник
$x = test
только печать,123
а не тоже456
?Вы можете использовать любой из них в своем сценарии, так как они записывают в потоки по умолчанию (выходные данные и ошибки). Если бы вы передавали выходные данные в другой командлет, вы бы хотели использовать Write-Output , который в конечном итоге завершится в Write-Host .
В этой статье описываются различные параметры вывода: PowerShell O предназначен для вывода.
источник
Пурпурный может быть одним из значений перечислителя "System.ConsoleColor" - Черный, Темно-синий, Темно-зеленый, Темно-коричневый, Темно-красный, Темно-пурпурный, Темно-желтый, Серый, Темно-серый, Синий, Зеленый, Голубой, Красный, Пурпурный, Желтый, Белый.
+ $File.FullName
Не является обязательным, и показывает , как поместить переменную в строку.источник
Вы просто не можете заставить PowerShell пропустить эти надоедливые переводы строк. Нет сценария или командлета, который делает это.
Конечно, Write-Host - абсолютная ерунда, потому что вы не можете перенаправлять / транслировать с нее! Вы просто должны написать свой собственный:
Например
источник
В действительности , но очень к сожалению , как Windows PowerShell, так и PowerShell Core начиная с версии 7.0, все их 6 (!) Потоков вывода отправляются на стандартный вывод при вызове извне через интерфейс командной строки PowerShell .
Посмотрите эту проблему GitHub для обсуждения этого проблемного поведения, которое, вероятно, не будет исправлено ради обратной совместимости.
На практике это означает, что любой поток PowerShell, в который вы отправляете вывод, будет воспринят внешним вызывающим как вывод stdout :
Например, если вы выполните следующую
cmd.exe
, вы не будете видеть не выход, так как стандартный вывод перенаправление вNUL
равной степени относится ко всем PowerShell потоки:C:\>powershell -noprofile -command "Write-Error error!" >NUL
Однако - любопытно - если вы перенаправить поток ошибок , PowerShell делает отправить свой поток ошибок в поток ошибок , так что с
2>
вы можете перехватывать вывод ошибок потока выборочно; следующие выходные данные просто'hi'
- вывод потока успеха - при захвате вывода потока ошибок в файлerr.txt
:C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt
Желательно поведением является:
1
PowerShell (число ) на стандартный вывод .Отправлять вывод из всех других потоков в stderr , который является единственным вариантом, учитывая, что между процессами существует только 2 выходных потока: stdout (стандартный вывод) для данных и stderr (стандартная ошибка) для сообщений об ошибках и всех других типов сообщений - например, в качестве информации о состоянии - это не данные .
Желательно сделать это различие в вашем коде, даже если в настоящее время оно не соблюдается .
Внутри PowerShell :
Write-Host
это для отображения вывода , и обходит выходной поток успеха - как таковой, его выход не может быть ни (непосредственно) захвачены в переменнойни подавленони перенаправлены.Его первоначальная цель состояла в том, чтобы просто создать обратную связь с пользователем и создать простые, основанные на консоли пользовательские интерфейсы (цветной вывод).
Из - за невозможности предварительного быть захвачены или перенаправлены, версия PowerShell 5 из
Write-Host
во вновь введенного потока информации (число6
), так что с тех пор она является можно захватывать и перенаправлятьWrite-Host
вывод.Write-Error
предназначен для записи нескончаемых ошибок в поток ошибок (число2
); концептуально поток ошибок является эквивалентом stderr.Write-Output
пишет в поток [output] success (число1
, который концептуально эквивалентен stdout; это поток для записи данных (результатов).Write-Output
редко требуется из-за неявной функции вывода PowerShell :Write-Output "Honey, I'm $HOME"
и"Honey, I'm $HOME"
эквивалентны, причем последний не только более кратким, но и быстрее.источник