如何正确指定mkvmerge.exe路径以实现全子文件夹批量处理?
解决mkvmerge批处理无需放置子文件夹即可运行的问题
你遇到的问题核心在于没有在循环中正确引用你定义的mkvmerge路径变量,导致系统只能在当前子文件夹中查找程序。下面是具体的修改方案:
问题分析
你已经通过set mkvmerge="D:\mkvmerge.exe"指定了程序的完整路径,但在处理单个FLV文件的循环里,你直接写了mkvmerge.exe,系统会默认在当前工作目录(也就是你pushd进入的子文件夹)寻找这个可执行文件,找不到就会失败。同时在合并文件的语句中,%mkvmerge%的写法在延迟环境变量启用的循环块内也不够稳妥。
修改后的完整批处理代码
setlocal enableDelayedExpansion set mkvmerge="D:\mkvmerge.exe" for /d /r %%D in (*) do ( pushd %%D set files= for %%A IN (*.flv) do ( !mkvmerge! -o "%%~nA.mkv" "%%~A" ) if not "!files!"=="" !mkvmerge! -o "output.mkv" !files:~2! popd ) pause
关键修改点
- 将循环内的
mkvmerge.exe替换为!mkvmerge!:因为你启用了延迟环境变量(enableDelayedExpansion),在for循环的代码块(括号内)中,必须用!变量名!的格式来实时引用变量,这样系统会直接调用你指定路径下的mkvmerge.exe。 - 合并文件语句中的
%mkvmerge%也改为!mkvmerge!:同样是为了在延迟环境变量块内正确获取变量值,避免使用循环开始前的旧值。
这样修改后,你只需要保证D:\mkvmerge.exe存在,批处理就能在所有子文件夹中直接调用它,无需复制到每个子目录里。
内容的提问来源于stack exchange,提问作者kmleong
相关产品推荐
相关产品推荐

