Запустите пакет SOX для файлов в соответствующей папке

У меня есть пакетный скрипт Windows, который запускает команду SOX для различных файлов, но я не знаю, как заставить пакет работать с файлами по пути, соответствующему исполняемому файлу SOX. В настоящее время все файлы находятся в корне и выводятся в / вместе.

Пакетный скрипт:

cd %~dp0
mkdir combined
FOR %%A IN (*.mp3) DO sox static.mp3 %%A "combined/%%~nxA"
pause

Я хочу, чтобы скрипт запускал команду sox для файлов в каталоге "audiotracks" и выводил ее в каталог "комбинированный". Чтобы дать вам представление, это будет желаемая структура папок:

/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

Это возможно, или есть лучший способ сделать это? Любая помощь будет принята с благодарностью. Большое спасибо!

2 ответа

Решение

Попробуйте сначала переключиться на директорию. Измените путь сохранения. (Две последовательные точки означают родительскую папку.)

cd %~dp0
mkdir combined
cd audiotracks
FOR %%A IN (*.mp3) DO sox static.mp3 %%A "../combined/%%~nxA"
cd ..
pause

Как и в большинстве задач программирования, есть несколько способов сделать то, что вы хотите. Ваша текущая реализация не слишком далека от рабочего решения. Настоящая проблема в том, что вы думаете о проблеме с неправильной точки зрения. Вместо того, чтобы пытаться обрабатывать файлы в относительной 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 в каталоге аудиотреков без даты, размера или других метаданных.
Другие вопросы по тегам