您需要知道管道中的项目数以跟踪进度。
Powershell 3.0 可以让您计算管道中的内容,而无需执行任何工作,而无需访问管道参数是否正确声明的.Count
属性。$Input
这也意味着你可以去掉这些begin {} process {} end {}
块,如果你愿意,只需一个简单的功能。
早期版本没有该Count
属性,因此您首先必须遍历并捕获管道以获取计数然后再次处理,这不是那么有效,稍后我将展示。
Powershell V2 版本:
function Show-ProgressV2{
param (
[Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
[PSObject[]]$InputObject,
[string]$Activity = "Processing items"
)
Begin {$PipeArray = @()}
Process {$PipeArray+=$InputObject}
End {
[int]$TotItems = ($PipeArray).Count
[int]$Count = 0
$PipeArray|foreach {
$_
$Count++
[int]$percentComplete = [int](($Count/$TotItems* 100))
Write-Progress -Activity "$Activity" -PercentComplete "$percentComplete" -Status ("Working - " + $percentComplete + "%")
}
}
}
Powershell V3 版本:
function Show-ProgressV3{
[CmdletBinding()]
param (
[Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
[PSObject[]]$InputObject,
[string]$Activity = "Processing items"
)
[int]$TotItems = $Input.Count
[int]$Count = 0
$Input|foreach {
$_
$Count++
[int]$percentComplete = ($Count/$TotItems* 100)
Write-Progress -Activity $Activity -PercentComplete $percentComplete -Status ("Working - " + $percentComplete + "%")
}
}
效率
将两者进行比较,V3 函数的速度大约快 5-6 倍,具体取决于管道的大小。
考虑以下预先过滤的文件列表,查找.jpg
我家驱动器中的所有文件,选择前 200 个文件并排序和列出,在管道中使用该函数 3 次,根据您的评论:
$V2 = Measure-Command {Get-ChildItem -Filter *.jpg -Recurse `
| Show-ProgressV2 -Activity "Selecting" `
| Select-Object -First 200 `
| Show-ProgressV2 -Activity "Sorting" `
| Sort-Object -Property FullName `
| Show-ProgressV2 -Activity "Listing" `
| FL}
$V3 = Measure-Command {Get-ChildItem -filter *.jpg -Recurse `
| Show-ProgressV3 -Activity "Selecting" `
| Select-Object -First 200 `
| Show-ProgressV3 -Activity "Sorting" `
| Sort-Object -Property FullName `
| Show-ProgressV3 -Activity "Listing" `
| FL}
$V2
$V3
这给了我以下时间:
PS C:\Users\Graham> C:\Users\Graham\Documents\Stack_ShowProgress_Pipeline.ps1
Days : 0
Hours : 0
Minutes : 0
Seconds : 48
Milliseconds : 360
Ticks : 483607111
TotalDays : 0.000559730452546296
TotalHours : 0.0134335308611111
TotalMinutes : 0.806011851666667
TotalSeconds : 48.3607111
TotalMilliseconds : 48360.7111
Days : 0
Hours : 0
Minutes : 0
Seconds : 8
Milliseconds : 335
Ticks : 83358374
TotalDays : 9.6479599537037E-05
TotalHours : 0.00231551038888889
TotalMinutes : 0.138930623333333
TotalSeconds : 8.3358374
TotalMilliseconds : 8335.8374