如果你需要編寫一些PowerShell腳本,尤其在處理一些相對復雜的任務時,你可能希望添加進度條的功能,以便隨時可以了解進展情況。
Write-Progress 這個命令可以幫助你完成簡單的需求,請參考官方文檔即可,但下圖一個示例,它會同時進行多個任務,并且能每個任務獨立更新進度。
范例代碼如下,請在PowerShell 7.x 以上版本運行測試。
using namespace System.Collectionsfunction 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 $_.BaseNameStatus = "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的方式。如果在早期版本,也是能夠實現的,但需要多寫很多額外的代碼。