Різниця в PowerShell між записом-хостом та записом-виходом?


Відповіді:


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, що робити з висновком на конвеєр, призначивши його змінній або подавши його до команди anoher, тоді він надсилається на вихід за замовчуванням, що зазвичай є консоллю, тому кінцевий результат виглядає однаковим .


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-Host.
galmok

@Summer Write-Output шкідливий, Write-Information - фантастичний. Виведення даних є ворогом функцій Powershell, які мають повернені значення.
Brain2000,

Згідно з документами , "Починаючи з Windows PowerShell 5.0, Write-Host є обгорткою для запису інформації. Це дозволяє використовувати Write-Host для виведення вихідних даних в інформаційний потік."
Фістром

0

Ви можете зрозуміти різницю між двома cmds на наведеному нижче прикладі:

Хост запису "msgtxt" | Get-Service При запуску вище, ви отримаєте результат у вигляді "msgtxt"

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.