Ce face Invoke-Command
Invoke-Command rulează blocul de cod din -ScriptBlock (sau un script local dat cu -FilePath) pe computerele din -ComputerName și întoarce tot ce produc, inclusiv erorile. Se conectează la cel mult 32 de computere în paralel (-ThrottleLimit), iar rezultatele apar în ordinea în care sosesc, nu în ordinea din listă. Fiecare obiect primit are proprietatea PSComputerName, ca să știi de unde vine. Obiectele aduse de la distanță sunt copii deserializate: au proprietăți, dar nu și metodele obiectului original.
Blocul de cod rulează pe computerul țintă, deci variabilele din el sunt evaluate acolo. Ca să trimiți o valoare locală, scrii $Using:variabila sau o dai prin -ArgumentList și o primești cu param(). Cu -ComputerName, fiecare apel creează o sesiune temporară, închisă la final; pentru mai multe comenzi care împart variabile, creezi o sesiune cu New-PSSession și o dai la -Session.
Erorile care ar opri execuția local devin, la distanță, erori care nu opresc comanda, ca un server cu probleme să nu blocheze restul. -AsJob rulează totul ca job în fundal. Din PowerShell 6.0, -HostName și -UserName folosesc SSH în loc de WinRM, între Windows, Linux și macOS. Cerințele pentru WinRM sunt aceleași ca la Enter-PSSession: remoting activat pe țintă și cont cu drepturi acolo. Alias: icm.
Parametri
| Parametru | Descriere |
|---|---|
-ComputerName |
Unul sau mai multe computere, separate prin virgulă (conexiune WinRM, sesiune temporară). |
-ScriptBlock |
Comenzile de rulat, între acolade. |
-FilePath |
Un script local care se rulează pe computerele țintă, fără să-l copiezi acolo. |
-ArgumentList |
Valori pentru parametrii blocului de cod, transmise după poziție. |
-Session |
Una sau mai multe sesiuni create cu New-PSSession; variabilele rămân între apeluri. |
-Credential |
Contul cu care rulează comanda pe țintă. |
-ThrottleLimit |
Numărul maxim de conexiuni simultane; implicit 32. |
-AsJob |
Rulează comanda ca job în fundal; rezultatele se citesc cu Receive-Job. |
-HideComputerName |
Nu mai afișează numele computerului în ieșire (obiectele îl păstrează). |
-HostName / -UserName / -KeyFilePath |
Conexiune prin SSH. Din PowerShell 6.0. |
Ce returnează
Ieșirea comenzilor rulate (obiecte deserializate cu PSComputerName); cu -AsJob, un obiect job.
Exemple
Exemplul 1: Spațiul liber pe discul C de pe două servere
Aceeași comandă rulează pe ambele servere; PSComputerName arată de unde vine fiecare rând.
Invoke-Command -ComputerName SRV-IASI01, SRV-CLUJ01 -ScriptBlock {
Get-PSDrive -Name C | Select-Object @{ Name = 'LiberGB'; Expression = { [math]::Round($_.Free / 1GB, 1) } }
} | Select-Object -Property PSComputerName, LiberGB
Ieșire în terminal
PSComputerName LiberGB
-------------- -------
SRV-IASI01 41.7
SRV-CLUJ01 118.2
Exemplul 2: O variabilă locală trimisă cu $Using:
$fisier există doar local; $Using:fisier îi trimite valoarea în blocul de cod de pe server.
$fisier = 'backup-facturi.log'
Invoke-Command -ComputerName SRV-IASI01 -ScriptBlock {
Get-Content -Path "D:/Loguri/$Using:fisier" -Tail 2
}
Ieșire în terminal
2026-10-24 18:02:11 Backup facturi: OK
2026-10-25 18:02:09 Backup facturi: OK
Exemplul 3: O sesiune persistentă pentru mai multe comenzi
Variabila $total creată la primul apel există și la al doilea, pentru că ambele folosesc aceeași sesiune.
$s = New-PSSession -ComputerName SRV-IASI01
Invoke-Command -Session $s -ScriptBlock { $total = (Get-ChildItem -Path D:/Facturi -File).Count }
Invoke-Command -Session $s -ScriptBlock { "Facturi: $total" }
Remove-PSSession -Session $s
Ieșire în terminal
Facturi: 1284
Greșeli frecvente
- Folosești în
-ScriptBlocko variabilă definită local și primești o valoare goală: pe server ea nu există; scrie$Using:numesau folosește-ArgumentList. - Rulezi două apeluri cu
-ComputerNameși aștepți ca variabilele din primul să existe în al doilea: fiecare apel are sesiunea lui; foloseșteNew-PSSessionși-Session. - Apelezi o metodă pe un obiect primit de la distanță (de exemplu
.Kill()pe un proces): obiectele sunt deserializate și nu au metode; rulează acțiunea în blocul de cod, pe server. - Din blocul de cod încerci să accesezi o partajare de rețea de pe alt server și primești acces refuzat: credențialele nu trec implicit mai departe (al doilea „hop”); CredSSP rezolvă asta, dar crește riscul de securitate.
Comenzi înrudite
Enter-PSSession: Deschide o sesiune interactivă pe un alt computer (prin WinRM sau, din PowerShell 6.0, prin SSH); ieși cu Exit-PSSession sau exit.Get-Service: Listează serviciile Windows, pornite și oprite, cu starea, numele scurt și numele afișat; există doar pe Windows.Get-Process: Afișează procesele care rulează pe computerul local, cu memoria folosită, timpul de procesor și ID-ul (PID) fiecăruia.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.