В чем разница в результате записи-хоста и записи-вывода?
Я новичок в 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 напрямую отправляет эту хеш-таблицу на консоль, не пытаясь изменить ее.