Разница в PowerShell между Write-Host и Write-Output?

Ответы:

82

Вкратце Write-Hostпишет в саму консоль. Думайте об этом как о MsgBox в VBScript . Write-Output, с другой стороны, записывает в конвейер, поэтому следующая команда может принять его в качестве входных данных. Вы не обязаны использовать Write-Outputдля записи объектов, поскольку Write-Outputэто неявно вызывается для вас.

PS> Get-Service

будет таким же, как:

PS> Get-Service | Write-Output
Шэй Леви
источник
16
В этом смысле Powershell чертовски запутан. Стоит прочитать эту ссылку, чтобы получить представление об упомянутом конвейере в PowerShell и о том, как значения возвращаются из функции. «Ключевое слово return в PowerShell вводит в заблуждение - честно говоря, я избегаю его, потому что оно совсем не работает, как большинство языков программирования». - powershell.org/forums/topic/…
Джим Ахо
1
Если вы вызываете функцию, которая имеет возвращаемое значение, НЕ используйте Write-Output в этой функции, иначе эта строка будет возвращена вместо вашего возвращаемого значения. Что может вызвать разного рода хаос.
Brain2000
28

Write-Output отправляет вывод в конвейер. Оттуда он может быть передан другому командлету или назначен переменной. Write-Host отправляет его прямо на консоль.

$a = 'Testing Write-OutPut'  | Write-Output
$b = 'Testing Write-Host' | Write-Host

Get-Variable a,b

Выходы:

Testing Write-Host

Name                           Value                                                                 
----                           -----                                                                 
a                              Testing Write-OutPut                                                  
b                                                  

Если вы не укажете Powershell, что делать с выводом в конвейер, назначив его переменной или связав его с другой командой, тогда он будет отправлен в исходное значение по умолчанию, которое обычно является консолью, поэтому конечный результат выглядит таким же .

мьолинор
источник
9

Write-Outputотправляет данные как объект по конвейеру. В примере с вопросами он просто передает строку.

write-hostзависит от хоста. В консоли write-hostпо сути дела [console]::WriteLine. См. Это для получения дополнительной информации.

Чад Кариш
источник
4
Просто чтобы уточнить для будущих читателей. Write-Ouputотправляет объекты. На этот раз это была строка, но, как правило, она отправляет объекты, и обычно в ней нет необходимости, поскольку это способ по умолчанию для вывода результатов / данных :)
Frode F.
5

Еще одно различие между Write-Host и Write-Output:

  • Write-Host отображает сообщение на экране, но не записывает его в журнал

  • Write-Output записывает сообщение в журнал, но не отображает его на экране.

А Write-Host считается вредоносным. Вы можете увидеть подробное объяснение в разделе Запись хоста считается опасным .

Лето
источник
2
Я считаю, что запись-вывод намного вреднее. Как вы убедитесь, что функция действительно возвращает ожидаемый результат, а не какой-то неожиданный мусор, выводимый командой?
MKesper
6
Думаю Write-Outputвыводит сообщение на экран, если вы запускаете скрипт самостоятельно. Так что я не уверен, что вы имеете в виду под «Write-Output записывает сообщение в журнал, но не отображает его на экране». ?
Джим Ахо
У вас не может быть возвращаемой информации Write-Output на экран, если она используется внутри функции, из которой вы записываете вывод в переменную. Это может даже испортить результат. Write-Host лучше подходит для этого.
galmok 08
@Summer Write-Output вреден, Write-Information - фантастичен. Write-Output - враг функций Powershell, которые имеют возвращаемые значения.
Brain2000
Согласно документам , «Начиная с Windows PowerShell 5.0, Write-Host является оболочкой для Write-Information. Это позволяет вам использовать Write-Host для передачи вывода в информационный поток».
Phistrom
0

Вы можете понять разницу между двумя cmds на примере ниже:

Запись хоста "msgtxt" | Get-Service При запуске выше вы получите вывод как "msgtxt"

Запись-вывод "msgtxt" | Get-Service При запуске, описанном выше, вы получите сообщение об ошибке, поскольку msgtxt не является именем какой-либо службы (в идеальном состоянии) (поскольку вы записываете его в конвейер, и он передается в качестве входных данных в Get-Service)

ЛАКШАЙ АРОРА
источник