vgmstream解码器脚本单次处理超70个文件即终止的问题排查
vgmstream解码器脚本单次处理超70个文件即终止的问题排查
首先,这个问题大概率是Windows命令处理器(CMD)的命令行参数长度限制导致的,而不是你脚本代码的逻辑错误——毕竟你提到同类项目都有这个问题,这完全符合CMD的这个固有特性。
为什么会出现这个问题?
CMD对单个命令行的总长度有严格限制(传统上限是8191字符,即使是较新的Windows版本,这个限制虽有放宽但依然存在)。当你拖放70+个文件到脚本上时,所有文件的完整路径会被作为参数传递给脚本,总长度很容易就超过了CMD的参数长度上限,导致脚本无法正常解析所有参数,直接终止运行。
你的脚本里的潜在风险点
看你当前的脚本,你用了%*来获取所有传入的文件参数,然后直接用for %%f in (%*) do (...)循环处理。当参数总长度超限的时候,这个%*会被截断,循环只能处理到一部分文件,甚至直接触发CMD的错误导致脚本终止。
解决办法
你可以修改脚本,改用从命令行参数列表中逐个读取的方式,避免直接使用%*带来的长度限制问题。另外,也优化了日志写入的逻辑,减少不必要的字符输出,核心是绕开CMD的参数长度限制。
这里给你一个调整后的脚本示例:
@echo off setlocal enabledelayedexpansion :: 创建输出目录(如果不存在) set "output_dir=%~dp1vgmstream" if not exist "!output_dir!" md "!output_dir!" & cls :: 初始化日志文件(可选,清空旧日志) echo vgmstream 解码日志 > "!output_dir!\vgmstream.log" echo -------------------- >> "!output_dir!\vgmstream.log" :: 逐个处理传入的文件参数 :process_next if "%~1"=="" goto log_done set "infile=%~1" :: 写入日志信息 echo [!date:~-10,2%/%date:~-7,2%/%date:~-4,4% @ %time:~0,2%:%time:~3,2%] >> "!output_dir!\vgmstream.log" echo Infile: !infile! >> "!output_dir!\vgmstream.log" echo Size: %~z1 bytes >> "!output_dir!\vgmstream.log" echo Codec: WAV >> "!output_dir!\vgmstream.log" echo Outfile: !output_dir!\%~n1.wav >> "!output_dir!\vgmstream.log" echo. >> "!output_dir!\vgmstream.log" :: 调用vgmstream-cli解码 "%~dp0vgmstream-cli.exe" "!infile!" -o "!output_dir!\%~n1.wav" :: 处理下一个参数 shift goto process_next :log_done start "" notepad "!output_dir!\vgmstream.log" endlocal
这个调整后的脚本用shift命令逐个读取参数,避免了一次性把所有参数加载到%*里,绕开了CMD的参数长度限制。同时启用了延迟变量扩展(enabledelayedexpansion),避免路径里的特殊字符导致的解析错误。
另外,如果你经常需要处理大量文件,也可以考虑改用PowerShell脚本来替代批处理,PowerShell对命令行参数的长度限制要宽松得多,处理大量文件会更稳定。
备注:内容来源于stack exchange,提问作者Mr. Mendelli
相关产品推荐
相关产品推荐

