Найкращий спосіб запису на консоль в PowerShell


142

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

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або яким є наміри?

Відповіді:


101

Поведінка PowerShell за замовчуванням полягає лише у тому, щоб скинути все, що випадає з конвеєра, не підхопившись іншим елементом трубопроводу чи не призначивши змінну (або перенаправлення) у Out-Host. ЩоOut-Host , очевидно, залежить від господаря.

Просто відпустити речі з конвеєра не є заміноюWrite-Host яка існує з єдиної причини виведення тексту в хост-програму.

Якщо ви хочете отримати результат, тоді використовуйте Write-*командлети. Якщо ви хочете повернути значення з функції, то просто скиньте туди об'єкти без жодного командлету.


1
Я набрав це в .vbs-скрипт. Просто цей рядок коду, і він кидає мені помилку.
FrenkyB

58

Середній пише на конвеєр. Write-Hostі Out-Hostпише до консолі. "ехо" - псевдонім, для Write-Outputякого також пишеться на конвеєр. Найкращим способом запису на консоль було б використанняWrite-Host командлета.

Коли об'єкт записується на конвеєр, він може споживатися іншими командами ланцюга. Наприклад:

"hello world" | Do-Something

але це не працюватиме, оскільки Write-Hostпише на консоль, а не на конвеєр (Do-Something не отримає рядок):

Write-Host "hello world" | Do-Something

3
Ця відповідь технічно правильна, але я підозрюю, що вона збиває користувача неофіта PowerShell. Перше правило ефективного PowerShell - це отримати вихід, який корисний у конвеєрі. Якщо ви дуже часто використовуєте Write-Host, ви, ймовірно, робите це неправильно.
OldFart

6
Ну хіба це не те, що запитував ОП, як записати на консоль? Існує різниця між записом до хоста і написанням на конвеєр, і треба знати, що робити кожен. Я оновлю свою відповідь уточненням.
Шай Леві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.