如何在PowerShell脚本中维护会话信息 实现中断后从断点续跑
PowerShell 断点续跑实现方案
完整可运行代码
# 配置项 $sourceFile = "1.txt" $progressFile = "progress.log" # 读取待处理的所有行,需要忽略空行可加条件过滤 | Where-Object { $_ -ne '' } $allLines = Get-Content $sourceFile $totalLines = $allLines.Count # 读取上次处理进度 $lastCompletedLine = -1 if (Test-Path $progressFile) { $readVal = Get-Content $progressFile -Raw if ([int]::TryParse($readVal, [ref]$lastCompletedLine)) { # 进度记录超过当前文件总行数时重置进度 if ($lastCompletedLine -ge $totalLines - 1) { $lastCompletedLine = -1 Remove-Item $progressFile -Force -ErrorAction SilentlyContinue } } } # 计算本次起始处理行号 $startLine = $lastCompletedLine + 1 if ($startLine -ge $totalLines) { Write-Host "所有内容已处理完成" exit 0 } Write-Host "本次从第 $($startLine + 1) 行开始处理,共 $totalLines 行" # 遍历处理 for ($i = $startLine; $i -lt $totalLines; $i++) { $currentVal = $allLines[$i] Write-Host "正在处理:$currentVal" try { # ---------------替换为你的业务逻辑开始--------------- # 示例代码可删除 Start-Sleep -Seconds 1 # 模拟报错测试可打开下一行注释 # if ($currentVal -eq "xyz") { throw "测试异常" } # ---------------替换为你的业务逻辑结束--------------- } catch { Write-Host "处理 $currentVal 时出错:$_" # 需要出错后立即终止脚本可打开下一行注释 # exit 1 } # 单条处理完成后立即更新进度,写入磁盘避免丢失 $i | Out-File $progressFile -Force -NoNewline } # 全部处理完成后清理进度文件,下次运行自动从头开始 Remove-Item $progressFile -Force -ErrorAction SilentlyContinue Write-Host "所有内容处理完成"
实现逻辑说明
- 核心是通过独立的
progress.log文件记录已经处理完成的最后一行行号,每处理完一行就同步更新进度,无论脚本是异常报错、用户按Ctrl+C终止还是正常运行结束,已完成的进度都不会丢失 - 处理中途中断时,当前正在处理的行还没更新到进度文件,下次重启会自动重新处理这行,完全符合从断点续跑的需求
注意事项
- 建议业务逻辑保证幂等性,即同一行内容重复处理不会产生异常或者错误结果,避免极端场景下(进度写入前瞬间中断)重复处理导致问题
- 如果
1.txt内容会经常变更、行号不固定,可以把进度记录改为存储最后处理完成的内容值,需要保证1.txt中没有重复的待处理值即可
内容的提问来源于stack exchange,提问作者Pavan kumar D
相关产品推荐
相关产品推荐

