Bir powershell betiğinde birkaç sunucudan sistem olay kayıtlarını çekmem gerek. Seri olarak bunları yapmak uzun sürdü. Paralel yapmak istedim.
Başlangıçta şöyle yapıyordum:
$ev1 = Get-WinEvent -Computername sunucu1 -FilterhashTable @{Logname="System";Id=4771;StartTime=(Get-Date).AddDays(-1)}
$ev1 = Get-WinEvent -Computername sunucu1 -FilterhashTable @{Logname="System";Id=4771;StartTime=(Get-Date).AddDays(-1)}
Paralel yapmanın birkaç yolu var. Bunlardan biri Powershell Job'larını kullanmak. Her bir sunucudan olayların çekilmesi için Start-Job ile birer görev oluşturdum.
$gorev1 = Start-Job -Name "g1" { Get-WinEvent -Computername sunucu1 -FilterhashTable @{Logname="System";Id=4771;StartTime=(Get-Date).AddDays(-1)} }
$gorev2 = Start-Job -Name "g2" { Get-WinEvent -Computername sunucu2 -FilterhashTable @{Logname="System";Id=4771;StartTime=(Get-Date).AddDays(-1)} }
Bu görevler eşzamanlı olarak bitmeyebilir. Onun için ikisinin de bittiğinden emin olmak için beklemem gerek. Bunu Wait-Job ile yapabilirim ama bu cmdlet çağrıldığında görevleri ekrana basar. Bunu görmek istemediğim için Out-Null ile çıkışı bastırıyorum.
Wait-Job -Jobs $gorev1, $gorev2 | Out-Null
Bu cmdlet işini bitirdikten sonra görevlerimin çıkışını okuyabilirim.
$olaylar1=Receive-Jobs -Job $gorev1
$olaylar2=Receive-Jobs -Job $gorev2
Her görev ayrı uzak sistemlerde çalıştığı için bu paralel çalışma, yaklaşık olarak iki görevin daha uzun süreni kadar zamanda bitiyor. Eğer bu iki görev de aynı yerel veya uzak sistemde çalışıyor olsaydı, duruma göre böyle bir kazanç elde edemeyebilirdim.
Bunu bir de Invoke-Command -Computername sunucuX { ... } -AsJob ile yapmak var.

