使用[system.diagnostics.stopwatch]测量多脚本总运行时长异常求助
问题原因与解决方案
核心问题
你遇到的情况是因为调用外部脚本时没有等待其执行完成就停止了计时。如果是用Start-Process启动外部脚本,默认是异步执行的——主脚本会立刻继续往下走,Stopwatch只记录了启动进程的毫秒级耗时,而非外部脚本的实际运行时间。
解决方案
方案1:同步调用脚本(推荐)
直接用调用运算符&或者点 sourcing(.)执行外部脚本,这两种方式都是同步的,主脚本会暂停直到外部脚本完全执行完毕:
# run.ps1 代码 $stopwatch = [System.Diagnostics.Stopwatch]::StartNew() # 用调用运算符同步执行外部脚本(不会导入外部脚本的变量到当前会话) & .\my_external_script.ps1 # 或者用点 sourcing(会将外部脚本的变量、函数导入当前会话,按需选择) # . .\my_external_script.ps1 $stopwatch.Stop() Write-Host "总运行时长: $($stopwatch.Elapsed.TotalSeconds) 秒"
方案2:若必须用Start-Process,添加-Wait参数
如果你的场景需要用Start-Process(比如要启动新窗口、指定权限等),一定要加上-Wait参数强制主脚本等待外部进程结束:
# run.ps1 代码 $stopwatch = [System.Diagnostics.Stopwatch]::StartNew() Start-Process -FilePath "powershell.exe" -ArgumentList "-File .\my_external_script.ps1" -Wait -NoNewWindow # -NoNewWindow 可选,避免弹出新的PowerShell窗口 $stopwatch.Stop() Write-Host "总运行时长: $($stopwatch.Elapsed.TotalSeconds) 秒"
验证效果
执行修改后的run.ps1,Stopwatch会准确记录包含my_external_script.ps1中60秒休眠在内的总运行时长,结果会接近60秒。
内容的提问来源于stack exchange,提问作者Gill-Bates
相关产品推荐
相关产品推荐

