在PowerShell中显示高级进度条

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PowerShell中显示高级进度条相关的知识,希望对你有一定的参考价值。

如果你需要编写一些PowerShell脚本,尤其在处理一些相对复杂的任务时,你可能希望添加进度条的功能,以便随时可以了解进展情况。

Write-Progress 这个命令可以帮助你完成简单的需求,请参考官方文档即可,但下图一个示例,它会同时进行多个任务,并且能每个任务独立更新进度。

范例代码如下,请在PowerShell 7.x 以上版本运行测试。

using namespace System.Collections


function Test-Progress 
    
    $files = Get-ChildItem `
    | Select-Object -Property BaseName `
    | Where-Object  $_.BaseName.length -gt 0  `
    | Select-Object -First 10


    $origin = @
    $index = 1
    $files | ForEach-Object  $origin.($_.BaseName) = @
            Id              = $index++
            Activity        = "0,30" -f $_.BaseName
            Status          = "Pending..."
            PercentComplete = 1 
            # 这里设置为0的话,有点问题,那个进度条看起来是100%
         




    $sync = [hashtable]::Synchronized($origin)


    $job = $files | ForEach-Object -AsJob -Parallel 
        $copySync = $using:sync
        $process = $copySync.($_.BaseName)
        
        1..100 | ForEach-Object 
            $process.Status = "Processing... $_ "
            Start-Sleep -Milliseconds `
                (Get-Random -Maximum 300 -Minimum 100)
                
            $process.PercentComplete = $_
        


        $process.Status = "Done"
    


    while ($job.State -eq 'Running') 
        $sync.Keys | Foreach-Object 
            if (![string]::IsNullOrEmpty($sync.$_.keys)) 
                $param = $sync.$_ 
                Write-Progress @param
            
        
        Start-Sleep -Seconds 0.1
    

如果要做多线程脚本,建议用Powershell 7.0以上版本,它的Foreach-Object已经直接支持Parallel的方式。如果在早期版本,也是能够实现的,但需要多写很多额外的代码。

以上是关于在PowerShell中显示高级进度条的主要内容,如果未能解决你的问题,请参考以下文章

powershell PowerShell中无休止的进度条

安卓高级组件-----进度条

Android学习—— Android高级控件

高级组件——进度条 JProgressBar

powershell 永远不会结束PowerShell中的进度条

powershell 永远不会结束PowerShell中的进度条