如何在PowerShell中編寫進度條?


當我們在PowerShell中編寫指令碼時,執行指令碼的使用者希望看到指令碼的進度,而不是在指令碼執行後臺任務時等待空閒並檢視空白游標。一種方法是使用Verbose引數檢視進度,但它不會顯示圖形化進度。要檢視圖形化進度,可以使用PowerShell支援的Write-Progress cmdlet。

Write-Progress cmdlet主要依賴於3個引數。

  • Activity − 進度條的標題,或者您可以提及正在執行的活動名稱。

  • Status − 進度條的副標題。這將是活動之後的第二行。

  • Percentage Completed − 已完成的百分比進度。這應該是整數。

檢視下面只包含activity引數的示例並執行程式碼。

示例

for($i=0;$i -le 100; $i++){
   Write-Progress -Activity "Counting from 1 to 100"
   sleep 1
}

輸出


在上面的輸出中,您可以看到“從1計數到100”是標題,“正在進行”是我們尚未修改的預設狀態。在這裡您可以看到沒有顯示進度,因為我們沒有使用Percentage引數。現在我們將修改同一示例中進度條的狀態。

示例

for($i=0;$i -le 100; $i++){
   Write-Progress -Activity "Counting from 1 to 100 " -Status "Counting $i
   times"
   $i
   sleep 1
}

輸出

正如您在上面的輸出中看到的,有了新的副標題,但我們仍然沒有看到完成的百分比,為此,您需要使用PercentComplete引數。

$tcount = 100
for($i=0;$i -le $tcount; $i++){

   $pcomplete = ($i / $tcount) * 100
   Write-Progress -Activity "Counting from 1 to 100" -Status "Counting $i times" -PercentComplete    $pcomplete
   $i
   sleep 1
}

當您檢視上面程式碼的輸出時,您將看到進度條正在工作。

現在我們來看另一個示例,這將幫助我們更好地瞭解進度條。在下面的示例中,我們使用了Windows事件命令來檢索每個Windows事件(如系統、應用程式、安全等)的前10個錯誤日誌,並且在檢索過程需要一些時間時,我們將使用進度條來顯示指令碼輸出的增長。

示例

$Winlogs = (Get-Eventlog -List).LogDisplayName
foreach($log in $Winlogs){
   try{
      $eventlog = Get-EventLog -LogName $log -EntryType Error -ErrorAction Stop| Select -First 10
      if($eventlog){
         Write-Output "`nLog Name : $log"
            for($i=0;$i -le $eventlog.count; $i++){
               $perct = ($i / $eventlog.count) * 100
               Write-Progress -Activity "Windows Logs Progress" -Status "Displaying Log : $log" -                 PercentComplete $perct
            $eventlog[$i]
            Sleep 1
         }
      }
   }
   catch [Exception]{
      Write-Warning "No logs found for $log"
   }
}

輸出

更新於:2020年5月15日

2K+ 次檢視

啟動您的職業生涯

完成課程獲得認證

開始
廣告