对相关文件夹中的文件运行 SOX 批处理

对相关文件夹中的文件运行 SOX 批处理

我有一个 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 文件,但不包含日期、大小或其他元数据。

相关内容