Powershell'de uzun süren görevlerin durumunu görüntülemeye yarayan bir "progress bar" gösterimi var. En basit haliyle işlerin ne durumda olduğunu göstermek için
...
Write-Progress -Activity "Aciliyor..."
...
Write-Progress -Activity "Isleniyor..."
...
Write-Progress -Activity "Kapaniyor..."
...
gibi bir kullanım mümkün. Sürecin neresinde olduğumuz konusunda genel bir fikir vermek için yeterli. Ama bu aşamada bir progress bar yok. Bunu yapabilmek için elimizdeki işin tümünün kaç birim olduğunu, şu bu işlerin ne kadarının işlendiğini bilmemiz gerek. Çok basit bir for döngüsü için
for ($i=0;$i -lt 10;$i++) {
Write-Progress -Activity "Sayiyor..." -PercentComplete $($i*10)
Start-Sleep 1
}
Çok hızlı saymasın diye, yavaşlatmak amacıyla Start-Sleep kullandım. Evet, bu bir ilerleme çubuğu verir, çünkü döngünün toplamda 10 kere tekrarlayacağı ve şu anda kaçıncı döngüde olduğumuz ($i) bilgisi elimizde var. Ama kafama birşey takıldı; ilerleme çubuğu ne zaman kayboluyor? -PercentComplete %100'e gelse bile kaybolmuyor. Ancak komut sonlandığında kayboluyor. Yani terminalde sadece
Write-Progress -Activity "Calisiyor..."
Yazıp enter'a basınca ilerleme çubuğu o kadar kısa bir sürede gösterilip kayboluyor ki göremiyorum bile. Peki, bir tuşa basılmasını bekleyen Read-Host ile kullansam?
Write-Progress -Activity "Calisiyor...";Read-Host
Faydasız, yine görünmedi. Peki Read-Host yerine Start-Sleep kullansam?
Write-Progress -Activity "Calisiyor...";Start-Sleep 1
Evet, şimdi 1 saniye boyunca bir ilerleme çubuğu görüntülendi. Buradan çıkan sonuç; -PercentComplete parametresi %100'e gelse bile görüntülenme devam ediyor, ancak console host kontrolü devralıncaya kadar. Klavye'den bir giriş yapılması gereken durumlarda progress bar kapanıyor. Ama bu kadar ile bitmiyor, Write-Progress'in bir de -Completed parametresi var. Bu sadece bu parametre progress bar'ı ekrandan kaldırabiliyor. Örnek:
Write-Progress -Activity "Calisiyor...";Start-Sleep 1;Write-Progress -Activity "Bitti" -Completed;Start-Sleep 2
Bunu çalıştırıp Enter'a basınca 1 saniye boyunca ekranda "Calisiyor..." yazıyor, sonrasında -Completed parametresi olan bir Write-Progress kullanımı olduğu için progress bar kayboluyor, 2 saniye de ekranda hiç progress bar gösterimi olmadan bekliyorum.
Write-Progress'in bundan biraz daha fazla ayrıntıya sahip parametreleri var. Örneğin -Activity parametresine ek bilgi sağlamak için -Status parametresi kullanılabilir. Bu parametre ile sağlanan bilgi, -Activity ile sağlanan bilginin altında görüntülenir.
Write-Progress -Activity "Calisiyor..." -Status "Dosya acildi"
gibi.
Aynı anda birden fazla progress bar gösterilmesi gereken durumlarda -Id paramteresi ile hangi progress bar'ın güncelleneceğini seçebiliriz.
for ($i=0; $i -lt 5; $i++) {
Write-Progress -Id 1 -Activity "i degiskeni artiyor" -Status "i=$i" -PercentComplete $($i*10)
for ($j=0; $j -lt 5; $j++) {
Write-Progress -Id 2 -Activity "j degiskeni artiyor" -Status "j=$j" -PercentComplete $($j*10)
Start-Sleep -Milliseconds 100
}
}
Ama burada iki progress bar da aynı seviyede yer aldı. Birisinin (i) diğerinin (j) üstü olduğunu göstermek için -Parent parametresi var. Bunun yaptığı tek şey, aslında j döngüsüne ait olan Write-Progress'i soldan girintili bir şekilde göstermek. j'nin ilerlemesini gösteren progress bar'a ait Write-Progress'in -Parent parametresine, üstü olan i döngüsünün Write-Progress'inin Id'sini vermek gerek. Aşağıdaki gibi.
for ($i=0; $i -lt 5; $i++) {
Write-Progress -Id 1 -Activity "i degiskeni artiyor" -Status "i=$i" -PercentComplete $($i*10)
for ($j=0; $j -lt 5; $j++) {
Write-Progress -Id 2 -Parent 1 -Activity "j degiskeni artiyor" -Status "j=$j" -PercentComplete $($j*10)
Start-Sleep -Milliseconds 100
}
}