You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell脚本指定位置统计Write-ProgressHelper调用次数?

解决方案

要实现统计指定步骤前的Write-ProgressHelper调用次数,从而让进度条从正确位置启动,可以按以下思路处理:

  1. 解析脚本并记录所有目标调用的位置:不仅统计调用总数,还要保存每个Write-ProgressHelper调用在脚本中的起始偏移量。
  2. 定位对应启动步骤代码块的起始位置:精准找到if ($startstep -eq X)代码块的起始位置。
  3. 统计目标位置前的调用次数:以此作为$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:05:24