PowerShell如何等待每个日志文件创建完成后再执行后续语句
解决方案
你这个问题需要做两层等待校验,避免API没执行完、日志没写完就进入下一轮循环,同时要修复原脚本里的笔误:
- 原脚本第一行赋值的变量是
$linesXmls,后续遍历用的是$lines,变量名不匹配会直接触发报错,先统一变量名 - 给
Start-Process加上-Wait参数,强制每一轮循环等调用的API进程执行退出后,再往下走 - 增加日志文件可用性轮询:部分API在进程退出前会做最后写入操作,进程刚退出时日志可能还被占用,需要等文件完全释放、写入完成再进下一轮
修改后的完整脚本如下:
$lines = @(Get-Content -Path "$path") -Replace " " ForEach($line in $lines) { $s = $line -split "," $var1s = $s[0] $var2s = $s[1] $targetLog = Join-Path "$path\folder" "$var2s.log" # 等待API进程执行完成 Start-Process -FilePath $APIpath -ArgumentList "$argument1", "$argument2", "$argument3", $targetLog -Wait # 轮询确认日志文件写入完成、无进程占用 $logCompleted = $false while (-not $logCompleted) { try { # 尝试以独占模式打开文件,打开成功说明没有进程在写入 $fs = [System.IO.File]::Open($targetLog, 'Open', 'Read', 'None') $fs.Close() $logCompleted = $true } catch { # 文件不存在/被占用时等待500ms重试 Start-Sleep -Milliseconds 500 } } }
轮询间隔默认设为500ms,如果你的单份日志体积大、API写入耗时长,可以适当调大这个等待值,减少无效的文件检测尝试。
内容的提问来源于stack exchange,提问作者Tom Wolf
相关产品推荐
相关产品推荐

