如何在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+ 次查看

启动您的职业生涯

完成课程获得认证

开始
广告