Лучший способ писать в консоль в PowerShell

143

У меня есть небольшая путаница по поводу различных способов печати (эха) на консоли. Я видел, что есть несколько способов записи вывода на консоль, например:

Write-Host "Hello world1"
"Hello World2"
Out-Host -InputObject "Hello World3"

Все три способа будут печатать на консоли. Средний как-то проще, менее многословен и проще в использовании. Я также обнаружил, что когда вы пишете такую ​​функцию, как:

function GetValues()
{
    "1"
    "2"
}

Он по-прежнему возвращает две строки в конвейере:

И я все еще могу распечатать значения:

foreach ($s in GetValues)
{
    Write-Host "s: " $s
}

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

Почему-то меня это сбивает с толку. Является ли "Print something"должен быть псевдонимом Write-Hostили что такое намерение?

Андре
источник

Ответы:

104

Поведение PowerShell по умолчанию - просто сбрасывать все, что выпадает из конвейера, не будучи подхваченным другим элементом конвейера или назначенным переменной (или перенаправленным) в Out-Host. То, что Out-Hostделает, явно зависит от хоста.

Просто позволить вещам выпасть из конвейера - это не замена, Write-Hostкоторая существует только по причине вывода текста в главном приложении.

Если вам нужен вывод, используйте Write-*командлеты. Если вам нужны возвращаемые значения из функции, просто выгрузите туда объекты без какого-либо командлета.

Джоуи
источник
1
Я набрал это в скрипте .vbs. Только эта строчка кода вызывает у меня ошибку.
FrenkyB 01
59

Средний пишет в конвейер. Write-Hostи Out-Hostпишет в консоль. «echo» - это псевдоним, для Write-Outputкоторого также выполняется запись в конвейер. Наилучший способ записи в консоль - использовать Write-Hostкомандлет.

Когда объект записывается в конвейер, он может быть использован другими командами в цепочке. Например:

"hello world" | Do-Something

но это не сработает, так как Write-Hostзапись выполняется в консоль, а не в конвейер (Do-Something не получит строку):

Write-Host "hello world" | Do-Something
Шэй Леви
источник
3
Этот ответ технически правильный, но я подозреваю, что он сбивает с толку начинающего пользователя PowerShell. Первое правило эффективного PowerShell - производить вывод, полезный в конвейере. Если вы очень часто используете Write-Host, возможно, вы делаете это неправильно.
OldFart
7
Ну, разве это не то, о чем спрашивал ОП, как писать в консоль? Есть разница между записью на хост и записью в конвейер, и нужно знать, что каждый из них делает. Я дополню свой ответ пояснением.
Шей Леви