Write-Host / Write-Output în PowerShell

Control și funcții Windows PowerShell 1.0

Write-Host scrie text doar pe ecran (cu culori), Write-Output trimite valori în pipeline, unde pot fi salvate într-o variabilă sau prelucrate.

Sintaxă
Write-Host [[-Object] <Object>] [-NoNewline] [-Separator <Object>] [-ForegroundColor <ConsoleColor>] [-BackgroundColor <ConsoleColor>]
Write-Output [-InputObject] <PSObject[]> [-NoEnumerate]

Ce face Write-Host / Write-Output

Write-Output (alias echo; pe Windows și write) trimite obiecte în fluxul principal de ieșire, același în care ajunge orice valoare scrisă singură pe un rând. De aceea Write-Output 'Gata' și simplu 'Gata' fac același lucru. Ce trimite poate fi preluat de comanda următoare, salvat într-o variabilă sau redirecționat într-un fișier.

Write-Host scrie direct pentru cel care se uită la consolă: poate colora textul (-ForegroundColor, -BackgroundColor), poate rămâne pe același rând (-NoNewline) și pune separatoare între valori (-Separator). Ce scrie nu intră în pipeline și nu ajunge în variabile. Din Windows PowerShell 5.0, Write-Host scrie în fluxul de informații (numărul 6), deci poate fi ascuns cu 6>$null sau -InformationAction Ignore.

Regula practică: datele pe care le întoarce un script sau o funcție merg prin Write-Output (sau implicit); mesajele de stare pentru om merg prin Write-Host, Write-Verbose sau Write-Warning. Culorile acceptate sunt valorile ConsoleColor: Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White.

Parametri

Parametru Descriere
Write-Host -Object Ce se afișează (pozițional); o colecție se scrie pe un rând, cu spații între elemente.
-ForegroundColor Culoarea textului (Green, Red, Yellow…).
-BackgroundColor Culoarea fundalului.
-NoNewline Nu trece la rând nou după text.
-Separator Textul pus între elementele afișate.
Write-Output -InputObject Obiectele trimise în pipeline (pozițional).
-NoEnumerate Trimite o colecție ca un singur obiect, nu element cu element.

Ce returnează

Write-Host nu returnează nimic în pipeline. Write-Output returnează exact obiectele primite.

Exemple

Exemplul 1: Mesaje colorate pentru utilizator

Primul rând apare verde în consolă. Valorile date separat se afișează cu un spațiu între ele.

Write-Host 'Backup terminat' -ForegroundColor Green
Write-Host 'Total:' 125 'lei'

Ieșire în terminal

Backup terminat
Total: 125 lei

Exemplul 2: Ce ajunge în variabilă

Mesajul lui Write-Host apare pe ecran în timpul apelului, dar în variabilă intră doar valoarea din Write-Output.

function Test-Iesire {
    Write-Host 'Mesaj pentru ecran'
    Write-Output 'Valoare returnată'
}
$rezultat = Test-Iesire
"În variabilă: $rezultat"

Ieșire în terminal

Mesaj pentru ecran
În variabilă: Valoare returnată

Exemplul 3: Pe același rând și cu separator

-NoNewline lipește următorul mesaj de cel curent; -Separator înlocuiește spațiul dintre elemente.

Write-Host 'Se procesează... ' -NoNewline
Write-Host 'gata'
Write-Host 'Iași', 'Cluj', 'Brașov' -Separator ' | '

Ieșire în terminal

Se procesează... gata
Iași | Cluj | Brașov

Greșeli frecvente

  • Să folosești Write-Host pentru rezultatul unei funcții: apelantul nu îl poate salva în variabilă sau trimite mai departe. Pentru date folosește Write-Output sau scrie valoarea direct.
  • Să trimiți un obiect complex la Write-Host: @{a = 1} | Write-Host afișează System.Collections.Hashtable. Formatează textul înainte sau folosește Out-String.
  • Să aștepți ca Write-Host ... > log.txt să scrie în fișier: > redirecționează doar fluxul de ieșire. Folosește 6> sau, mai simplu, Write-Output.

Comenzi înrudite

  • Funcții și param(): O funcție grupează cod sub un nume; param() îi declară parametrii, cu tip și valoare implicită, iar [CmdletBinding()] o face să meargă ca un cmdlet.
  • Out-File: Salvează într-un fișier ieșirea unei comenzi, exact cum apare în consolă; operatorii de redirecționare > și >> fac același lucru.
  • Pipeline (|): Operatorul | trimite obiectele unei comenzi, unul câte unul, comenzii următoare; $_ este obiectul curent, iar && și || înlănțuie comenzi.
  • try / catch / finally: try/catch prinde erorile care opresc o comandă, iar finally rulează mereu; pentru erorile obișnuite ale cmdlet-urilor pui -ErrorAction Stop.