В чем разница в результате записи-хоста и записи-вывода?

Я новичок в PowerShell и, делая некоторый код, я прошел через эту вещь. Пока пользуюсь Write-Host а также Write-Output Для выполнения одного и того же запроса я получаю разные результаты:

PS> Write-Output $PSVersionTable                                                                                                                   

Name                           Value                                                                                                                                               
----                           -----                                                                                                                                               
PSVersion                      5.0.10586.117                                                                                                                                          
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                                                             
BuildVersion                   10.0.10586.117
CLRVersion                     4.0.30319.17929
WSManStackVersion              3.0                                                                                                                                                 
PSRemotingProtocolVersion      2.3                                                                                                                                                 
SerializationVersion           1.1.0.1                                                                                                                                             

против

PS> Write-Host $PSVersionTable                                                                                                                   
System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry

4 ответа

Важное отличие:

Write-output записывает объект в конвейер, поэтому следующая команда может принять его в качестве входного. Пока Write-host просто пишу прямо в консоль.

В вашем примере

Write-Output записывает объект в конвейер, а Out-Default (скрытый в конце конвейера) отображает значения объекта в виде таблицы или списка.

Write-Host пишет напрямую в консоль, а не использует стандартный командлет Out-default в конце конвейера. Другими словами, Write-Host ничего не записывает в конвейер, а только отображает то, что он видит, в консоль. Вот почему вы можете добавлять такие параметры, как -foregroundcolor, в командлет Write-Host, но не в командлет Write-output.,

Write-Host полезен при отладке, и вам нужно отображать текст разными цветами.

Вы можете просто проверить это с

Write-Output "Hello World" | Get-Member

Мы можем видеть, что это объект System.String.

Если мы бежим:

Write-Host "Hello World" | Get-Member

Мы получаем сообщение об ошибке: gm: Вы должны указать объект для командлета Get-Member...

Похоже, вы уже знаете, что Write-Host а также Write-Output имеют разные цели. Короче:

  • Чтобы произвести вывод (данных), просто используйте команду или выражение как есть, которое неявно выводит их в выходной поток успеха (данных) - явное использование Write-Output редко требуется:

    • Вместо Write-Output $PSVersionTable Вы можете просто использовать $PSVersionTable само собой.
  • Write-Hostв PSv4- печатает напрямую на хост (например, на консоль), минуя выходные потоки PowerShell, поэтому этого обычно следует избегать. Хотя начиная с версии 5 он интегрирован в выходные потоки PowerShell, через новый поток № 6 лучше использовать его преемника, Write-Information - если вам не нужно создавать цветной вывод консоли для создания пользовательских интерфейсов.


Чтобы объяснить разницу в выводе консоли:

  • Write-Output так же, как и неявный вывод, использует форматирование вывода по умолчанию в PowerShell, которое обычно обеспечивает более удобное представление, чем просто вызов .ToString() на базовые экземпляры типа.NET - см. Get-Help about_Format.ps1xml

    • $PSVersionTable.GetType().FullName говорит нам, что $PSVersionTable это пример [System.Management.Automation.PSVersionHashTable] который вытекает из [System.Collections.Hashtable] форматирование PowerShell по умолчанию отображается в виде таблицы с двумя столбцами.
  • Write-Host по существу называет просто .ToString() на его аргументы, которые во многих случаях просто выводят полное имя типа объекта.

    • призвание .ToString() на [System.Management.Automation.PSVersionHashTable] экземпляр даст только System.Management.Automation.PSVersionHashTable,
      Тем не мение, Write-Host печатает элементы объектов, которые поддерживают [IEnumerable] интерфейс индивидуально.

    • Таким образом, каждая запись в $PSVersionTable печатается отдельно, а так как записи имеют тип [System.Collections.DictionaryEntry], который также переводит в строку просто полное имя типа - System.Collections.DictionaryEntry - вы получите разделенный пробелами список этих строк (потому что Write-Host обычно объединяет отдельные выходы с одним пробелом каждый).

Обратите внимание, что вы можете явно запросить строковое представление форматирования вывода PowerShell по умолчанию через Out-String Командлет.

Следовательно, помимо аспекта интеграции потоков, следующее Write-Host Команда выдает тот же вывод консоли, что и Write-Output $PSVersionTable (или просто: $PSVersionTable):

Write-Host ($PSVersionTable | Out-String)

Вот два лучших результата при поиске в Google:

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

Что я должен использовать: "Write-Host", "Write-Output" или "[console]:: WriteLine"?

*Редактировать:Write-Host не поддерживает тип данных $PSVersionTable в то время как Write-Output делает. Чтобы увидеть, какой из них поддерживает какой тип данных вы можете использовать

Get-Help Write-Host
Get-Help Write-Output

И еще одна хорошая статья: какая запись подходит для PowerShell?

Короче говоря, $PSVersionTable возвращает хеш-таблицу (набор объектов). Команда write-host пытается преобразовать все в строку и затем показать ее на консоли, но вы не можете преобразовать всю хеш-таблицу непосредственно в строку.

Write-Output напрямую отправляет эту хеш-таблицу на консоль, не пытаясь изменить ее.

Другие вопросы по тегам