Różnica PowerShell między Write-Host i Write-Output?

Odpowiedzi:

82

Krótko mówiąc, Write-Hostpisze do samej konsoli. Pomyśl o tym jak o MsgBox w VBScript . Write-Outputz drugiej strony zapisuje do potoku, więc następne polecenie może zaakceptować to jako swoje dane wejściowe. Nie musisz używać go Write-Outputdo pisania obiektów, jak Write-Outputjest to dla ciebie domniemane.

PS> Get-Service

byłby taki sam jak:

PS> Get-Service | Write-Output
Shay Levy
źródło
16
W ten sposób Powershell jest tak cholernie zagmatwany. Warto przeczytać ten link, aby poczuć wspomniane pipline w PowerShell i jak wartości są zwracane z funkcji. „Słowo kluczowe return w programie PowerShell jest mylące - szczerze mówiąc, unikam go, ponieważ w ogóle nie działa jak większość języków programowania”. - powershell.org/forums/topic/…
Jim Aho,
1
Jeśli wywołujesz funkcję, która ma wartość zwracaną, NIE używaj funkcji Write-Output w tej funkcji lub ten ciąg zostanie zwrócony zamiast wartości zwracanej. Które mogą powodować różnego rodzaju spustoszenie.
Brain2000
28

Write-Output wysyła dane wyjściowe do potoku. Stamtąd można go przesłać potokiem do innego polecenia cmdlet lub przypisać do zmiennej. Write-Host wysyła go bezpośrednio do konsoli.

$a = 'Testing Write-OutPut'  | Write-Output
$b = 'Testing Write-Host' | Write-Host

Get-Variable a,b

Wyjścia:

Testing Write-Host

Name                           Value                                                                 
----                           -----                                                                 
a                              Testing Write-OutPut                                                  
b                                                  

Jeśli nie powiesz Powershell, co zrobić z wyjściem do potoku, przypisując go do zmiennej lub przesyłając go do innego polecenia, zostanie on wysłany do out-default, którym jest zwykle konsola, więc wynik końcowy wygląda tak samo .

mjolinor
źródło
9

Write-Outputprzesyła dane jako obiekt przez potok. W przykładzie z pytaniami po prostu przekaże ciąg.

write-hostzależy od hosta. W konsoli write-hostzasadniczo robi [console]::WriteLine. Zobacz to, aby uzyskać więcej informacji.

Chad Carisch
źródło
4
Tylko dla wyjaśnienia dla przyszłych czytelników. Write-Ouputwysyła przedmioty. Tym razem był to ciąg znaków, ale generalnie wysyła obiekty i zwykle nie jest potrzebny, ponieważ jest to domyślny sposób wyświetlania wyników / danych :)
Frode F.
5

Kolejna różnica między Write-Host i Write-Output:

  • Write-Host wyświetla komunikat na ekranie, ale nie zapisuje go w dzienniku

  • Write-Output zapisuje komunikat w dzienniku, ale nie wyświetla go na ekranie.

A Write-Host jest uważany za szkodliwy. Szczegółowe wyjaśnienie można znaleźć w artykule Write-Host Consented Consented Harmful .

Lato
źródło
2
Uważam, że zapis-wyjście jest znacznie bardziej szkodliwy. W jaki sposób upewniasz się, że funkcja faktycznie zwraca oczekiwany wynik, a nie jakieś nieoczekiwane dane wyjściowe polecenia?
MKesper
6
Myślę, że Write-Outputwyświetla komunikat na ekranie, jeśli sam uruchamiasz skrypt. Nie jestem więc pewien, co masz na myśli, mówiąc „Write-Output zapisuje komunikat w dzienniku, ale nie wyświetla go na ekranie”. ?
Jim Aho,
Nie możesz zwrócić informacji Write-Output na ekran, jeśli są one używane w funkcji, z której przechwytujesz dane wyjściowe do zmiennej. Może nawet zrujnować produkcję. Do tego lepiej nadaje się Write-Host.
galmok
@ Letnie wyjście zapisu jest szkodliwe, informacja zapisu jest fantastyczna. Write-Output jest wrogiem funkcji Powershell, które zwracają wartości.
Brain2000
Zgodnie z dokumentacją „Począwszy od programu Windows PowerShell 5.0, Write-Host jest opakowaniem dla Write-Information. Pozwala to na użycie Write-Host do emitowania danych wyjściowych do strumienia informacji”.
Phistrom
0

Możesz zrozumieć różnicę między dwoma cmds z poniższego przykładu:

Write-host "msgtxt" | Get-Service Po uruchomieniu powyżej otrzymasz wynik jako "msgtxt"

Zapis-wyjście "msgtxt" | Get-Service Po uruchomieniu powyżej pojawi się błąd, ponieważ msgtxt nie jest nazwą żadnej usługi (w idealnym stanie) (ponieważ zapisujesz go do potoku i jest przekazywany jako dane wejściowe do Get-Service)

LAKSHAY ARORA
źródło