如何在PowerShell脚本指定位置统计Write-ProgressHelper调用次数?
解决方案
要实现统计指定步骤前的Write-ProgressHelper调用次数,从而让进度条从正确位置启动,可以按以下思路处理:
- 解析脚本并记录所有目标调用的位置:不仅统计调用总数,还要保存每个
Write-ProgressHelper调用在脚本中的起始偏移量。 - 定位对应启动步骤代码块的起始位置:精准找到
if ($startstep -eq X)代码块的起始位置。 - 统计目标位置前的调用次数:以此作为
$step的初始值,确保进度条从正确的进度点开始更新。
修改后的完整脚本代码
Param( [Parameter(Mandatory=$True)] [int] $startstep ) function Write-ProgressHelper { param( [int]$StepNumber, [string]$Message ) Write-Progress -ID 0 -Activity 'Installation Part 1' -Status $Message -PercentComplete (($StepNumber / $steps) * 100) } # 读取脚本内容并解析所有Token $scriptContent = Get-Content -Path "$PSScriptRoot\$($MyInvocation.MyCommand.Name)" -Raw $tokens = @() [void][System.Management.Automation.PsParser]::Tokenize($scriptContent, [ref]$tokens) # 1. 统计所有Write-ProgressHelper调用的总数和它们的起始偏移量 $progressCalls = $tokens | Where-Object { $_.Type -eq 'Command' -and $_.Content -eq 'Write-ProgressHelper' } $steps = $progressCalls.Count # 2. 找到对应startstep的代码块起始位置 $targetBlockStart = $tokens | Where-Object { $_.Type -eq 'Keyword' -and $_.Content -eq 'if' -and $tokens[$_.Start + 1].Content -match "\(\$startstep\s*-\s*eq\s*$startstep\)" } | Select-Object -First 1 -ExpandProperty Start # 3. 统计目标代码块之前的Write-ProgressHelper调用次数,作为初始step值 $step = ($progressCalls | Where-Object { $_.Start -lt $targetBlockStart }).Count # 执行对应步骤的逻辑 if ($startstep -eq 1) { Write-Host "Step $startstep" Write-ProgressHelper -Message 'Part 1' -StepNumber ($step++) Start-Sleep -Seconds 5 Write-Host "Step $startstep" Write-ProgressHelper -Message 'Part 1' -StepNumber ($step++) Start-Sleep -Seconds 5 Write-Host "Step $startstep" Write-ProgressHelper -Message 'Part 1' -StepNumber ($step++) Start-Sleep -Seconds 5 Write-Host "Step $startstep" Write-ProgressHelper -Message 'Part 1' -StepNumber ($step++) Start-Sleep -Seconds 5 } if ($startstep -eq 2) { Write-Host "Step $startstep" Write-ProgressHelper -Message 'Part 2' -StepNumber ($step++) Start-Sleep -Seconds 5 Write-Host "Step $startstep" Write-ProgressHelper -Message 'Part 2' -StepNumber ($step++) Start-Sleep -Seconds 5 Write-Host "Step $startstep" Write-ProgressHelper -Message 'Part 2' -StepNumber ($step++) Start-Sleep -Seconds 5 }
关键说明
- Token解析优化:将脚本内容一次性读取为Raw格式,避免逐行处理的误差,同时记录每个Token的起始偏移量用于位置对比。
- 精准定位步骤代码块:通过匹配
if ($startstep -eq X)的Token组合,准确找到对应步骤代码的起始位置。 - 统计前置调用次数:对比每个
Write-ProgressHelper调用的起始偏移量和目标代码块的起始位置,筛选出之前的调用并统计数量,作为$step的初始值。
当传入-startstep 2时,$step会被初始化为4(对应步骤1中的4次调用),进度条会从4/7开始更新。
内容的提问来源于stack exchange,提问作者Gene Parmesan
相关产品推荐
相关产品推荐

