1

У меня есть пакетный скрипт 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 ответа2

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .