Запустите пакет 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 в каталоге аудиотреков без даты, размера или других метаданных.