自动编译运行.cpp的批处理脚本计时异常问题求助
批处理计时bug排查与改进方案
现存核心问题
- 时间计算完全失效:你的PowerShell命令里,
$start = Get-Date和$end = Get-Date是重新获取当前时间,根本没用到之前批处理里记录的start和end变量,所以输出的是PowerShell执行这两行代码的耗时,自然会显示极短的时间。 - 进程等待机制有误差:用
tasklist + timeout 1秒循环等待,每次至少会多等1秒,导致计时不准;另外如果系统里有同名进程,还会误判。 - 日期格式兼容性差:不同Windows系统的
%DATE%格式可能不同(比如MM/DD/YYYY或DD/MM/YYYY),你的字符串解析逻辑会出错,导致时间记录失效。
修正后的批处理代码
@echo off setlocal enabledelayedexpansion cd TeamCode\src\main\cpp\sources mkdir ..\exec 2>nul rem 编译C++程序 gcc -o ..\exec\jpgtest.exe jpg_usage_example.cpp sdk\jpgengine.cpp Position.cpp -lstdc++ if !ERRORLEVEL! NEQ 0 ( echo 编译失败,终止执行... exit /b !ERRORLEVEL! ) cd ..\exec rem 用PowerShell直接记录开始时间并运行程序、计算耗时,避免格式兼容问题 powershell -Command "$startTime = Get-Date; & '.\jpgtest.exe'; $endTime = Get-Date; $elapsed = ($endTime - $startTime).TotalSeconds; Write-Output $elapsed" > temp.txt set /p elapsedTime=<temp.txt del temp.txt echo 执行时间: %elapsedTime% 秒 endlocal
改进说明
- 直接用PowerShell完成计时全流程:避免批处理日期格式的兼容性问题,同时确保开始时间是程序启动前的时间,结束时间是程序退出后的时间,计时准确。
- 去掉冗余的进程等待逻辑:PowerShell的
& '.\jpgtest.exe'会等待程序执行完毕再继续,无需手动循环检测进程。 - 简化流程:减少中间变量传递的错误,直接在PowerShell内完成计时计算。
测试方法
- 在你的C++代码里添加一段固定时长的延迟,比如:
重新编译运行批处理,如果输出的执行时间接近3秒(加上程序本身的耗时),说明计时功能正常。#include <chrono> #include <thread> // 在保存图片的代码前后添加 std::this_thread::sleep_for(std::chrono::seconds(3));
内容的提问来源于stack exchange,提问作者Kadir
相关产品推荐
相关产品推荐

