Существует несколько способов вывода сообщений. Что такое эффективная разница между выводя что - то с помощью Write-Host
, Write-Output
или [console]::WriteLine
?
Я также заметил, что если я использую:
write-host "count=" + $count
+
Получает включены в вывод. Почему это? Разве выражение не должно быть вычислено, чтобы произвести единственную объединенную строку прежде, чем это будет записано?
powershell
Скотт Лэнгхэм
источник
источник
Write-Output
когда вы излучаете результаты.Write-Host
когда вы излучаете информацию регистрации. Никогда не используйте[console]::writeline()
.[console]::writeline("hello world")
этим, с которым вы не можете делатьWrite-Host "hello world"
. Другой, более подходящий, более недавно применимый ответ заключается в том, что данныеwrite-host
переносятсяwrite-information
таким образом, что их данные помещаются в поток, такимwrite-error
образом, вы можете захватывать их и использовать в другом месте.[console]::writeline()
не делает этогоОтветы:
Write-Output
следует использовать, если вы хотите отправить данные по конвейеру, но не обязательно хотите отобразить их на экране. Конвейер в конце концов запишет это,out-default
если больше ничего не использует это сначала.Write-Host
следует использовать, когда вы хотите сделать наоборот.[console]::WriteLine
по сути то, чтоWrite-Host
делает за кадром.Запустите этот демонстрационный код и проверьте результат.
Вам необходимо заключить операцию конкатенации в круглые скобки, чтобы PowerShell обрабатывал конкатенацию перед токенизацией списка параметров
Write-Host
или для использования интерполяции строк.Кстати - посмотрите это видео Джеффри Сновера, объясняющего, как работает конвейер. Когда я начал изучать PowerShell, я обнаружил, что это наиболее полезное объяснение того, как работает конвейер.
источник
Write-Output
что это значение по умолчанию, например, если у вас есть PsObject, и вы просто выплевываете его на экран, делая это,$object
он фактически делает то же самое, что и этотWrite-Output $object
. Стоит упомянутьWrite-Output
. См. Github.com/PoshCode/PowerShellPracticeAndStyle/issues/… > Использовать возврат только для завершения выполнения. > Избегайте записи-вывода (...). Вместо этого, когда вы хотите сделать вывод более понятным, просто назначьте вывод переменной с соответствующим именем. и поместите эту переменную в строку, чтобы обозначить явный вывод. > Write-Output -NoEnumerate не работает в PowerShell 6 и выполняется в течение 16 месяцев или дольше - его не планируется исправлять. В итоге:> НЕ ИСПОЛЬЗУЙТЕ Write-Output - НИКОГДА.Помимо того, что упомянул Энди, есть еще одно отличие, которое может иметь важное значение - write-host напрямую пишет на хост и ничего не возвращает, а это означает, что вы не можете перенаправить вывод, например, в файл.
Теперь запустите в PowerShell:
Как видно, вы не можете перенаправить их в файл. Это может быть удивительно для тех, кто не осторожен.
Но если вместо этого использовать запись-вывод, перенаправление будет работать так, как ожидается.
источник
Вот еще один способ сделать эквивалент записи-вывода. Просто поместите вашу строку в кавычки:
Вы можете убедиться, что это работает так же, как Write-Output, запустив этот эксперимент:
Первые два будут выводить «бла-бла» в out.txt, а третье - нет.
«help Write-Output» дает подсказку о таком поведении:
В этом случае сама строка «count = $ count» является объектом в конце конвейера и отображается.
источник
Для использования
Write-Host
,PSScriptAnalyzer
производит следующую диагностику:См. Документацию за этим правилом для получения дополнительной информации. Выдержки для потомков:
У Джеффри Сновера есть запись в блоге Write-Host считается вредной, в которой он утверждает, что Write-Host - почти всегда неправильная вещь, потому что это мешает автоматизации и дает больше объяснений по поводу диагностики, однако вышеприведенное является хорошим резюме.
источник
Из моего тестирования Write-Output и [Console] :: WriteLine () работают намного лучше, чем Write-Host.
В зависимости от того, сколько текста вам нужно написать, это может быть важно.
Ниже приведены результаты по 5 тестов для каждого типа Write-Host, Write-Output и [Console] :: WriteLine ().
Из своего ограниченного опыта я обнаружил, что при работе с любыми данными из реального мира мне нужно отказаться от командлетов и перейти к командам более низкого уровня, чтобы добиться приличной производительности от моих сценариев.
источник
Write-Output
иWrite-Host
служат различным целям, поэтому нет смысла сравнивать их эффективность. Да, прямое использование типов .NET и их методов происходит быстрее, но вы упускаете возможности более высокого уровня, которые могут предоставить командлеты PowerShell.[Console]::WriteLine()
Это похоже наWrite-Host
рассматриваемый случай, но не будет работать при любых обстоятельствах, потому что не все хосты PowerShell являются консолями .Относительно [Console] :: WriteLine () - вы должны использовать его, если вы собираетесь использовать конвейеры в CMD (не в powershell). Скажем, вы хотите, чтобы ваш ps1 передавал много данных на стандартный вывод, а некоторые другие утилиты использовали их для преобразования / преобразования. Если вы используете Write-Host в скрипте, это будет намного медленнее.
источник