Write-Output to prosty, ale często niedoceniany cmdlet PowerShella, który wysyła podany obiekt do potoku (pipeline) — czyli na tak zwane standardowe wyjście sukcesu. W praktyce to sposób, żeby jawnie powiedzieć: „ten obiekt ma polecieć dalej”. Kluczowa rzecz do zapamiętania: Write-Output nie służy do gadania z użytkownikiem na ekranie (od tego jest Write-Host), tylko do przekazywania danych kolejnemu poleceniu albo do zmiennej. Obiekt zachowuje przy tym swój typ, więc nie tracisz właściwości ani metod po drodze.
Składnia i najważniejsze opcje
Podstawowa forma jest banalna: Write-Output [-InputObject] . Cmdlet ma dosłownie dwa parametry, więc nie ma się gdzie zgubić:
-InputObject— obiekt (lub tablica obiektów), który ma trafić do potoku. Jest pozycyjny, więc zwykle piszesz go bez nazwy:Write-Output "coś".-NoEnumerate— blokuje „rozwijanie” kolekcji. Bez niego tablica przekazana dalej jest rozbijana na pojedyncze elementy; z nim leci jako jeden obiekt kolekcji.
To wszystko. Żadnych flag typu -Color czy -NoNewline — jeśli szukasz kolorów, jesteś w złym cmdlecie. Dodatkowo działają wspólne parametry (common parameters), ale merytorycznie sterujesz tu tylko tymi dwoma.
Przykłady użycia
Write-Output "Deploy zakończony"— wypisuje tekst na wyjście; w konsoli zobaczysz go tak samo jak przy zwykłym echo, bo PowerShell na końcu dokładaOut-Default.Write-Output $wynik | Where-Object { $_.Status -eq "OK" }— przepuszcza obiekt(y) do dalszego filtrowania. Tu widać sens cmdletu: dane, nie napis.$lista = Write-Output "a","b","c"—$listastaje się trzyelementową tablicą, bo domyślnie kolekcja jest rozwijana.Write-Output @(1,2,3) -NoEnumerate | Measure-Object—Measure-Objectdostaje jeden obiekt (całą tablicę), więcCountwyniesie 1, a nie 3.Write-Output $proces | Get-Member— sprawdzasz, że obiekt zachował typ i właściwości, zamiast zostać spłaszczonym do stringa.
Częste błędy i pułapki
Mylenie z Write-Host. Write-Host pisze prosto na konsolę i domyślnie nie da się go przechwycić do zmiennej ani do potoku. Write-Output odwrotnie — to jest do przechwytywania. Jak chcesz zwrócić dane z funkcji, używaj Write-Output (albo po prostu zostaw wyrażenie bez przypisania, bo PowerShell i tak wrzuca je na wyjście).
Pułapka -NoEnumerate w Windows PowerShell 5.1. Jeśli podasz -InputObject jawnie z nazwą, kolekcja i tak zostanie rozwinięta mimo -NoEnumerate. Obejście: przekaż argument pozycyjnie, czyli Write-Output $tab -NoEnumerate, nie -InputObject $tab. W PowerShell 7 zachowanie jest już spójniejsze.
Testowanie efektu w konsoli. Nie zobaczysz działania -NoEnumerate gołym okiem w konsoli, bo domyślny Out-Default i tak enumeruje wynik do wyświetlenia. Efekt liczy się dopiero, gdy przekazujesz dane do kolejnego cmdletu w potoku.
Powiązane komendy: Write-Host, Write-Verbose, Write-Error, Out-Default, Out-Host, Measure-Object.