Powershell Invoke-Command Nedir ve Nasıl Kullanılır
Powershell Invoke-Command nedir ve nasıl kullanılır. Invoke-Command cmdlet’i kullanarak, yerel veya uzak bir bilgisayarda komutları çalıştırır ve hatalar da dahil olmak üzere komutların çıktılarını döndürür. Tek bir Invoke-Command komutu ile onlarca hatta yüzlerce bilgisayarda komut çalıştırabilirsiniz.
Uzak bir bilgisayarda tek bir komut çalıştırmak için ComputerName parametresini kullanırız.
1 2 3 |
Invoke-Command -ComputerName Srv01 -Credential Domain01\User01 -ScriptBlock { Get-service} |
Uzak bir bilgisayarda tek bir komut çalıştırmak yerine bir script çalıştırmak istersek aşağıdaki komutu kullanırız.
1 2 3 |
Invoke-Command -FilePath c:\demo\test.ps1 -ComputerName Srv01 |
İstersek PsSession açarak invoke command çalıştırabiliriz bunun için aşağıdaki komutu kullanırız.
1 2 3 4 |
$mysession = New-PSSession -ComputerName Srv01 -Credential aliortul\ali Invoke-Command -Session $mysession -ScriptBlock {Get-Culture} |
Bir arka plan işinde komut çalıştırmak için AsJob parametresini kullanıyoruz.
1 2 3 4 5 |
$s = New-PSSession -ComputerName Srv01, Srv02 Invoke-Command -Session $s -ScriptBlock {Get-EventLog system} -AsJob |
Job create ettikten sonra
Get-Job diyerek hangi jobların çalıştığını görebilir.
Receive-Job diyerek çalışan jobları çekebilirsiniz.
Invoke-Command ve Foreach döngüsü
Benim bu makalede üzerine basmak istediğim konu ise Invoke-command’in nasıl çalıştığından ziyade Invoke-Command’in kendisi ile foreach komutu çalıştırarak aradaki farkı görmek ve göstermek.
Aşağıdaki iki komutda özü itibariyle aynı. Her iki komutta uzak sunucularda. Bu uzak sunucuları ben bir txt dosyasından çekmeyi tercih ettim. “D” ile başlayan servisleri çeker.
Fakat burada basit ama etkili bir ayrım var. Bildiğiniz üzere foreach döngüsü döngü içerisindeki her komutu tek tek çalıştırır. İşin güzel tarafı sonuçları da her bir kayıt için ayrı ayrı döndürür.
1 2 3 |
Invoke-Command -ComputerName (Get-Content -Path C:\ali\servers.txt) {Get-Service -Name d*} |
1 2 3 |
foreach ($s in (Get-Content C:\Ali\servers.txt) ) { Invoke-Command -ComputerName $s {Get-Service -Name d*}} |
Aşağıdaki resimde gördüğünüz üzere ben bu komutun çıktılarını measure-command ile ölçtüğümde Invoke-command tek başına toplam sonucu döndürürken. Foreach ile çalıştırdığımda her bir sonucu bana ayrı ayrı döküyor. Bu altkırılım istediğimde benim için harika bir özellik.