Bash遍历指定文件夹文件并等待CMD程序执行完成的问题
解决Bash遍历MID文件调用CMD录制脚本的错误问题
看起来你的问题主要出在Bash循环语法错误、路径传递格式不匹配以及CMD脚本参数处理这几个地方,我来一步步帮你解决:
1. 先修复Bash循环的基础语法错误
你原来的循环脚本少了一个分号,导致Bash无法正确解析done命令,这是报错的直接原因。修正后的循环应该是这样的(两种写法都可以):
# 单行写法,注意done前的分号和变量的引号 for filename in /ToBeRendered/*.mid; do ./1Processor.cmd "$filename"; done
或者更易读的多行写法:
for filename in /ToBeRendered/*.mid do # 用引号包裹变量,避免文件名/路径有空格时被拆分 ./1Processor.cmd "$filename" done
2. 处理Bash到Windows的路径转换问题
因为你调用的是Windows程序(Synthesia.exe),如果你的Bash环境是WSL(Windows子系统Linux)或者Git Bash,Linux风格的路径(比如/ToBeRendered/xxx.mid)无法被CMD识别,需要转换成Windows格式(比如C:\ToBeRendered\xxx.mid):
如果是WSL环境:
用wslpath -w命令转换路径:
for filename in /ToBeRendered/*.mid; do # 把Linux路径转换成Windows格式 win_filename=$(wslpath -w "$filename") ./1Processor.cmd "$win_filename" done
如果是Git Bash/Cygwin环境:
用cygpath -w命令替代:
for filename in /ToBeRendered/*.mid; do win_filename=$(cygpath -w "$filename") ./1Processor.cmd "$win_filename" done
3. 修正你的1Processor.cmd脚本
你原来的CMD命令里有几个小问题:
DirectoryHere\%~1是多余的,因为我们已经传递了完整的文件路径- 末尾的
exit没必要,START /WAIT已经会等待Synthesia执行完毕
修正后的1Processor.cmd内容:
START /WAIT "" "C:\Program Files (x86)\Synthesia\Synthesia.exe" --on-startup Play --on-song-end Quit "%~1"
这里的"%~1"会正确接收传递过来的Windows格式路径,并且引号能处理路径中的空格。
4. 确保CMD脚本有可执行权限(可选)
如果Bash提示无法执行1Processor.cmd,可以先赋予它可执行权限:
chmod +x 1Processor.cmd
按照上面的步骤调整后,应该就能正常遍历每个MID文件,逐个调用Synthesia录制并等待完成了。
内容的提问来源于stack exchange,提问作者TheYargonaut
相关产品推荐
相关产品推荐

