我有一个 Windows 批处理脚本,它对各种文件运行 SOX 命令,但我不知道如何让批处理对 SOX 可执行文件相对路径的文件运行。目前,所有文件都在根目录中,并输出到 /combined。
批处理脚本:
cd %~dp0
mkdir combined
FOR %%A IN (*.mp3) DO sox static.mp3 %%A "combined/%%~nxA"
pause
我希望脚本对目录“audiotracks”中的文件运行 sox 命令并将其输出到目录“combined”。为了让您有个概念,这将是所需的文件夹结构:
/root
sox.exe
batch.bat
static.mp3
/audiotracks
audio1.mp3
audio2.mp3
audio3.mp3
audio4.mp3
/combined
audio1out.mp3
audio2out.mp3
audio3out.mp3
audio4out.mp3
这可能吗,或者有更好的方法吗?任何帮助都将不胜感激。非常感谢!
答案1
尝试先切换到目录。然后更改保存路径。(两个连续的点表示父文件夹。)
cd %~dp0
mkdir combined
cd audiotracks
FOR %%A IN (*.mp3) DO sox static.mp3 %%A "../combined/%%~nxA"
cd ..
pause
答案2
与大多数编程任务一样,有多种方法可以完成您想要的任务。您当前的实现与可行的解决方案相差不远。真正的问题是您从错误的角度考虑问题。您不应该尝试处理相对目录中的文件,而audiotracks
应该考虑将结果输出到相对combined
目录。以下是可以调整脚本的方法:
cd %~dp0
mkdir combined
cd audiotracks
FOR %%A IN (*.mp3) DO sox ..\static.mp3 "%%A" "..\combined\%%~nxA"
pause
另一种更灵活的实现方式可能是使用命令/f
的参数for
。(运行for /?
以获取更多详细信息。)这样做将允许您对输入和输出使用相对路径。
cd %~dp0
mkdir combined
FOR /f "tokens=*" %%A IN ('dir /b .\audiotracks\*.mp3') DO sox static.mp3 "%%A" ".\combined\%%~nxA"
pause
让我们分解一下:
/f
意味着一次一个标记地处理单引号中(括号内)的命令输出。"tokens=*"
表示将整行输出解析为单个标记。(基本上,这意味着空格不被视为分隔符。)'dir /b .\audiotracks\*.mp3'
表示列出音轨目录中的所有 *.mp3 文件,但不包含日期、大小或其他元数据。