Invoke-Command to jeden z filarów PowerShell Remoting. Pozwala uruchomić blok poleceń albo cały skrypt — lokalnie, ale przede wszystkim zdalnie na jednym lub kilkuset komputerach naraz. Zamiast logować się po RDP na każdą maszynę, odpalasz jedno polecenie i zbierasz wyniki w swojej konsoli. Działa po WinRM (domyślnie), więc na zdalnych hostach musi być włączona usługa (Enable-PSRemoting). To podstawowe narzędzie każdego, kto administruje więcej niż jednym Windowsem.
Składnia i najważniejsze opcje
Podstawowa forma: Invoke-Command [-ComputerName
-ScriptBlock { ... }— kod do wykonania, ujęty w nawiasy klamrowe. Wymagany, jeśli nie podajesz pliku.-ComputerName— lista hostów (oddzielona przecinkami). Bez niej polecenie leci lokalnie.-FilePath— uruchamia skrypt.ps1z Twojego dysku na zdalnych maszynach (zamiast-ScriptBlock).-Session— używa trwałego połączenia zNew-PSSession, gdy chcesz dzielić stan między wieloma wywołaniami.-Credential— konto, na którym wykonać polecenie (np. zGet-Credential).-ArgumentList— przekazuje argumenty do bloku (odbierane przezparam()albo$args).-AsJob— uruchamia jako zadanie w tle; wyniki odbierasz przezReceive-Job.-ThrottleLimit— limit jednoczesnych połączeń (domyślnie 32). Przydatne przy setkach hostów.
Przykłady użycia
Invoke-Command -ComputerName SRV01 -ScriptBlock { Get-Service Spooler }— sprawdza stan usługi bufora wydruku na zdalnym serwerze.Invoke-Command -ComputerName SRV01, SRV02, SRV03 -ScriptBlock { Restart-Service WinRM }— restartuje usługę na trzech maszynach jednym strzałem.Invoke-Command -ComputerName SRV01 -FilePath C:\skrypty\audit.ps1— wysyła lokalny skrypt i wykonuje go zdalnie.Invoke-Command -ComputerName WEB01 -ScriptBlock { param($dni) Get-EventLog System -Newest $dni } -ArgumentList 10— przekazuje argument do bloku i pobiera 10 ostatnich wpisów logu.Invoke-Command -ComputerName (Get-Content hosts.txt) -ScriptBlock { $env:COMPUTERNAME } -AsJob— odpala na liście hostów z pliku w tle.
Częste błędy i pułapki
Najczęstszy zgrzyt to brak skonfigurowanego WinRM — dostajesz błąd „WinRM cannot complete the operation”. Na celu trzeba wcześniej puścić Enable-PSRemoting -Force. Druga klasyka: second hop — zdalna sesja nie przekaże dalej Twoich poświadczeń, więc dostęp do udziału sieciowego z poziomu bloku zwykle pada (rozwiązanie to CredSSP albo delegacja Kerberos).
Pamiętaj, że zmienne lokalne nie wjeżdżają do bloku same z siebie — w PowerShell 3.0+ użyj prefiksu $using: (np. $using:sciezka) albo przekaż je przez -ArgumentList. I nie myl tego z -ComputerName w innych cmdletach: tam często leci protokół RPC/DCOM, a tu twardo WinRM.
Powiązane komendy: Enter-PSSession, New-PSSession, Enable-PSRemoting, Receive-Job, Get-Credential, Invoke-Expression.