如何让批处理脚本在目标文件所在目录运行C++程序?
问题
我正尝试编写一个.bat脚本,在更高端的计算环境中运行一个小型C++程序。该脚本在本地电脑可正常运行,但当前采用本地固定目录路径,无法直接给他人使用或在其他设备(如U盘)运行。
原脚本代码如下:
cd C:\Users\username\Desktop\file\subfile1\subfile2
此代码用于切换至桌面subfile2目录(C++程序及相关文件存放处),后续执行命令:
main -m C:\Users\username\Desktop\file\subfile1\subfile2\c++_file_part1 C:\Users\username\Desktop\file\subfile1\subfile2\c++_file_part2 > C:\Users\username\Desktop\file\subfile1\subfile2\output.txt
该命令运行由两部分组成的C++程序并输出结果。我希望只需提供subfile2文件夹,他人即可在自己的电脑上运行该程序,无需依赖固定目录路径。此外,该程序用于采用5种不同格式转录音频,我需通过脚本自动运行以测试不同格式的转录耗时差异。请问该如何实现?
解决方案
1. 改造脚本实现路径无关运行
Windows批处理可以利用%~dp0获取当前脚本所在的绝对路径,以此实现路径无关:
@echo off :: 切换到脚本所在目录(即subfile2文件夹) cd /d "%~dp0" :: 用相对路径运行程序,无需固定路径 main -m c++_file_part1 c++_file_part2 > output.txt
%~dp0会自动解析出当前.bat脚本的完整目录路径,不管脚本在U盘还是其他电脑的任意位置,都能准确定位到subfile2文件夹。- 切换目录后,后续命令里的文件直接用相对路径即可,无需再写长串固定路径。
2. 自动测试多格式并统计耗时
要测试5种音频格式的转录耗时,可结合批处理循环和计时功能实现:
方案一:批处理原生命令计时
@echo off cd /d "%~dp0" :: 定义要测试的5种格式(请根据程序实际参数调整格式标识) set "formats=mp3 wav flac ogg m4a" :: 循环测试每种格式 for %%f in (%formats%) do ( echo 正在测试格式:%%f echo 开始时间:%time% :: 替换-f %%f为程序实际指定格式的参数,比如--format %%f main -m c++_file_part1 c++_file_part2 -f %%f > output_%%f.txt echo 结束时间:%time% echo -------------------------- ) pause
方案二:PowerShell精准计时(推荐)
批处理原生time精度有限,用PowerShell可获取毫秒级计时:
@echo off cd /d "%~dp0" set "formats=mp3 wav flac ogg m4a" for %%f in (%formats%) do ( echo 正在测试格式:%%f powershell -Command "$start = Get-Date; .\main -m c++_file_part1 c++_file_part2 -f %%f > output_%%f.txt; $end = Get-Date; $耗时 = $end - $start; echo '耗时:' + $耗时.TotalSeconds + ' 秒'" echo -------------------------- ) pause
- 每个格式的输出会单独保存到
output_格式名.txt,方便后续对比结果。 - 把
-f %%f替换为你的C++程序实际指定音频格式的参数,确保和程序逻辑匹配。
注意事项
- 确保
main.exe、c++_file_part1、c++_file_part2以及测试用音频文件都放在subfile2文件夹内。 - 如果程序依赖额外的.dll库文件,也要一并放入subfile2目录,避免运行时缺失依赖。
内容的提问来源于stack exchange,提问作者gdaem
相关产品推荐
相关产品推荐

