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

如何用PowerShell监控Windows10升级日志且首次匹配后不卡顿?

问题原因

Get-Content加-Wait参数后会持续监听日志文件的新增内容,除非进程被主动终止,否则管道不会自动结束。你当前的写法中第一个Get-Content -Wait匹配到10%进度后仍然会继续监听日志,永远不会执行后面的20%匹配逻辑,导致脚本看起来停滞。

纯PowerShell解决方案

仅启动一次日志监听进程,在同一个处理逻辑中匹配所有进度节点即可,不需要重复调用Get-Content:

# 配置路径参数
$setupLogPath = 'C:\$WINDOWS.~BT\Sources\Panther\setupact.log'
$outputLogPath = '\\SERVER1\Logs\Upgrade.log'
# 存储已记录的进度,避免重复写入
$loggedProgress = @{}

Get-Content -Path $setupLogPath -Tail 0 -Wait | ForEach-Object {
    # 匹配进度行,提取百分比数值
    if ($_ -match 'Mapped Global progress: \[(\d{1,3})%\]') {
        $currentProgress = [int]$matches[1]
        # 仅未记录过的进度才写入日志,可根据需要调整为只记录10%、20%等固定步进
        if (-not $loggedProgress.ContainsKey($currentProgress)) {
            $logLine = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] Upgrade stage is at $currentProgress% progress"
            Add-Content -Path $outputLogPath -Value $logLine
            $loggedProgress[$currentProgress] = $true

            # 进度到100%后自动退出脚本,避免持续运行
            if ($currentProgress -eq 100) {
                exit 0
            }
        }
    }
}

如果只需要记录固定步进的进度(比如10%、20%间隔),可以修改判断逻辑:

# 定义需要记录的进度节点
$targetNodes = @(10,20,30,40,50,60,70,80,90,100)
if ($targetNodes -contains $currentProgress -and -not $loggedProgress.ContainsKey($currentProgress)) {
    # 写入日志的逻辑和上面一致
}
方案优势
  • 无需调用外部程序,完全基于PowerShell原生命令实现
  • 仅启动一次日志监听,没有多进程阻塞问题
  • 自带去重逻辑,不会重复写入相同进度的日志
  • 支持自动退出,升级完成后脚本自动停止,无需手动结束

内容的提问来源于stack exchange,提问作者JAG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:36:03