Powershell: Pasek postępu

24-lis-2015

Chcesz w swoim skrypcie pokazać użytkownikowi, że coś się dzieje. Przydałoby się wyświetlić pasek postępu, podobny do tego jaki powershell wyświetla podczas aktualizacji helpa czy ładowania modułu. Żaden problem. Mamy do tego specjalną komendę Write-Progress.

progress_bar_powershellZałóżmy, że masz listę 15 serwerów na których masz wykonać pewne czynności. Nieco schematycznie można by sobie więc wyobrazić, że budujesz pętlę. Tutaj pokażę pętlę for, która ma się wykonać dokładnie 15 razy:

$NumberOfServers=15
For($i=0; $i -lt $NumberOfServers;$i++)
{
   #do some work on server
   Write-Host "Working on server $i"
   Start-Sleep -Seconds 1
 }

Jak widać – same uproszczenia u nas… zamiast listy serwerów 15 iteracji, zamiast prawdziwej pracy – tylko wyświetlenie komunikatu i jednosekundowy sen. Zaraz dodamy do tego przykładu pasek postępu.

Prezentowane polecenie write-progress posiada dwa ważne argumenty:

  • Activity – jest to nazwa czynności wyświetlana na pasku, ale też nazwa wykorzystywana przez koleje wywołania Write-Progress. Dzięki tej nazwie Powershell wie, który pasek postępu ma zaktualizować, bo w danej chwili może ich wyświetlać więcej.
  • PercentCompleted – pozwala na przesłanie procentowego statusu ukończenia zadania.
  • Completed – pozwala zamknąć pasek postępu.

Kiedy chcesz aktualizować pasek możesz posłużyć się poleceniem:

Write-Progress -Activity 'Working' -PercentComplete (100*$i/$NumberOfServers)

Wyrażenie 100*$i/$NumberOfServers jedynie przelicza na którym procencie jesteśmy wraz ze zwiększaniem $i będziemy coraz to bardziej zbliżać się do wartości 100:

  • 100*0/15 = 0
  • 100*1/15 = 6,66
  • 100*2/15 =13,33
  • …..

Aby pasek zamknąć po zakończeniu pętli wywołasz:

Write-Progress -Activity 'Working' -Completed

Cały skrypt może więc wyglądać tak:

$NumberOfServers=15
For($i=0; $i -lt $NumberOfServers;$i++)
{
   #Update display
   Write-Progress -Activity 'Working' -PercentComplete (100*$i/$NumberOfServers)
   #do some work on server
   Write-Host "Working on server $i"
   Start-Sleep -Seconds 1
}
Write-Progress -Activity 'Working' -Completed

Co ciekawe jeśli ten skrypt odpalimy w konsoli znakowej, to też będzie działać, ale pasek postępu będzie znakowy!

 

 

 

 

 

 

 

Komentarze:

  1. Kurs Powershell dla początkujących: Informacja dla studentów | Kursy OnlineKursy Online napisał,

    […] Powershell: Pasek postępu […]

Autor: Rafał Kraik