Najlepszy sposób na pisanie do konsoli w PowerShell

142

Mam trochę zamieszania co do różnych sposobów drukowania (echa) na konsoli. Widziałem, że istnieje wiele sposobów zapisywania danych wyjściowych do konsoli, takich jak:

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

Wszystkie trzy sposoby zostaną wydrukowane na konsoli. Środkowy jest w jakiś sposób prostszy, mniej szczegółowy i łatwiejszy w użyciu. Uważam również, że pisząc funkcję taką jak:

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

Nadal zwraca dwa ciągi w potoku:

Nadal mogę wydrukować wartości:

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

Odkryłem, że użycie samego ciągu znaków w cudzysłowie nie zawsze pojawia się na niestandardowych hostach i że musiałem użyć Write-Host, aby uzyskać wartości do drukowania na niestandardowych hostach.

W jakiś sposób wydaje mi się to zagmatwane. Ma "Print something"być aliasem Write-Hostlub jaki jest zamiar?

Andre
źródło

Odpowiedzi:

101

Domyślnym zachowaniem programu PowerShell jest po prostu zrzucenie wszystkiego, co wypada z potoku bez przechwytywania przez inny element potoku lub przypisywania do zmiennej (lub przekierowywania) do Out-Host. To, co Out-Hostrobi, jest oczywiście zależne od hosta.

Samo pozwolenie, by rzeczy wypadły z potoku, nie jest substytutem tego, Write-Hostco istnieje tylko z powodu wyprowadzania tekstu w aplikacji hosta.

Jeśli chcesz uzyskać dane wyjściowe, użyj Write-*poleceń cmdlet. Jeśli chcesz zwrócić wartości z funkcji, po prostu zrzuć tam obiekty bez żadnego polecenia cmdlet.

Joey
źródło
1
Wpisałem to w skrypcie .vbs. Tylko ta linia kodu i wyrzuca mi błąd.
FrenkyB
58

Środkowy pisze do potoku. Write-Hosti Out-Hostpisze do konsoli. „echo” to alias, dla Write-Outputktórego również zapisuje dane do potoku. Najlepszym sposobem zapisu w konsoli byłoby użycie polecenia Write-Hostcmdlet.

Gdy obiekt jest zapisywany w potoku, może być używany przez inne polecenia w łańcuchu. Na przykład:

"hello world" | Do-Something

ale od tego czasu to nie zadziała Write-Host zapisuje do konsoli, a nie do potoku (Zrób coś nie otrzyma ciągu):

Write-Host "hello world" | Do-Something
Shay Levy
źródło
3
Ta odpowiedź jest technicznie poprawna, ale podejrzewam, że prowadzi ona na manowce nowicjusza użytkownika PowerShell. Pierwszą zasadą skutecznego programu PowerShell jest tworzenie danych wyjściowych przydatnych w potoku. Jeśli bardzo często używasz Write-Host, prawdopodobnie robisz to źle.
OldFart
6
Cóż, czy nie o to pytał OP, jak pisać do konsoli? Istnieje różnica między pisaniem do hosta a pisaniem do potoku i trzeba wiedzieć, co każdy z nich robi. Zaktualizuję odpowiedź o wyjaśnienie.
Shay Levy