如何用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
相关产品推荐
相关产品推荐

