pondělí 24. listopadu 2008

Použití Write-Progress

Na školení PowerShellu se jeden z kolegů ptal, jak udělal /\/\o\/\/ progress bar při instalaci PowerTab. Pro ty z vás, co jej neznají (myslím progress bar :) - jedná se o tento pruh



který je umístěn v horní části okna PowerShellu. Při delším načítání (zapisování, kopírování, ...) dat je to vhodná pomůcka pro uživatele. V každém okamžiku ví, kde přesně se v čase nachází. Abyste nemuseli něco takového sami vymýšlet, je přímo v PowerShellu cmdlet Write-Progress. Pojďme se podívat, jak funguje.

Write-Progress má dva povinné parametry:
  • activity - řetězec, který říká, jaká aktivita probíhá (na obrázku výše je to Loading records ...)
  • status - popisuje konkrétní (aktuální) stav aktivity; v našem případě 136 of 633.
Pokud použijete pouze tyto dva parametry, můžete vyzkoušet jednoduché zobrazení hodnoty čítače (aby bylo něco vidět, přidal jsem čekání 100ms před každou změnou)

for($i=0; $i -le 50; $i++) {
Start-Sleep -m 100
Write-Progress "Ukazuji promennou..." $i }

Výsledkem je následují výstup


Takovýto základní ukazatel nám asi ve většině případů nebude stačit. Je dobré dát uživateli vědět, jak dlouho bude ještě čekat na dokončení operace. K tomu slouží další dva parametry (musí se uvádět jejich jméno)
  • percentComplete - ukazuje formou "teploměru", kolik procent je již hotovo (viz úplně první obrázek)
  • secondsRemaining - počet vteřin do skončení operace
Ukažme si jednoduchý příklad použití druhého parametru

for($i=0; $i -le 10; $i++) {
Start-Sleep 1
$sec = 10-$i
Write-Progress "Ukazuji promennou..." $i -secondsRemaining $sec }

Ve smyčce for zvyšujeme hodnotu proměnné i do deseti a zároveň zobrazujeme počet vteřin zbývajících do konce operace.


Pro úplné popsání Write-Progress nám ještě chybí následující parametry
  • id - specifikuje jedinečné ID progress baru. Lze použít pro zpětné volání.
  • currentOperation - popisuje aktuální operaci. Je více specifický než status.
  • parentId - aktivita nadřazená té aktuální
  • completed - standardně false, pokud je true nezobrazuje se progress bar
  • sourceId - zdroj záznamu
Pokud chcete vidět nějaký smysluplný příklad stáhněte si zdrojové kódy ke knize Windows PowerShell: TFM a koukněte se na P093-InventoryProgress.ps1.

Write-Progress můžete ovládat několika následujícími parametry:
  • $ProgressPreference - může nabývat hodnot SilentlyContinue, Continue, Stop, Inquire. Pokud nastavíte SilentlyContinue, progress bar nebude vidět (stejné jako kdybyste pro každý nastavili -completed = $true).
  • $host.PrivateData.get_Progress*, $host.PrivateData.Progress* - nastavují/zobrazují barvu progress baru.

První obrázek v tomto článku vznikl, při načítání dat z databáze Lotus Notes. V současné době používám novější verzi, která navíc zobrazuje data načítaného záznamu

Write-Progress -Activity "Loading records..." -Status "$i of $DomNumOfDocs" -id 1 -CurrentOperation "$LNlastname" -PercentComplete ($i/$DomNumOfDocs*100)

Žádné komentáře: