Invoke-Command în PowerShell

Module, pachete și remoting Windows PowerShell 2.0

Rulează comenzi sau scripturi pe unul sau mai multe computere deodată și aduce înapoi rezultatele, inclusiv erorile.

Sintaxă
Invoke-Command [-ComputerName] <String[]> [-ScriptBlock] <ScriptBlock> [-ArgumentList <Object[]>] [-Credential <PSCredential>]
Invoke-Command -Session <PSSession[]> -ScriptBlock <ScriptBlock>
Invoke-Command -HostName <String[]> -ScriptBlock <ScriptBlock> [-UserName <String>]

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 -ScriptBlock o variabilă definită local și primești o valoare goală: pe server ea nu există; scrie $Using:nume sau 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ște New-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.