4

Я сделал этот скрипт, но он не работает:

for /R %%f in (*.mkv) do (
 ffmpeg -i "%%f" -vf subtitles="%%~nf.mkv" -acodec copy "%%~nf.mp4"
 )

 PAUSE

После поиска проблемы, я обнаружил, что проблема заключается в имени файла, квадратные скобки должны быть экранированы (например, [1080p]coolvid.mp4 должно стать \[1080p\]coolvid.mp4 . Как я могу сделать это с именем файла (то есть %% f)?

1 ответ1

4

Квадратные скобки должны быть экранированы

Используйте следующий пакетный файл:

@echo off
setlocal
setlocal enabledelayedexpansion
for /r %%f in (*.mkv) do (
  set _a=%%~nf
  set _b=!_a:[=\[!
  set _name=!_b:]=\]!
  set _c=%%f
  set _d=!_c:[=\[!
  set _fullname=!_d:]=\]!
  ffmpeg -i "!_fullname!" -vf subtitles="!_name!.mkv" -acodec copy "!_name!.mp4"
  )
endlocal
pause

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • enabledelayedexpansion - отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа.
  • for /r - перебирать файлы (подпапки Recurse).
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
  • Редактирование и замена переменных - Редактирование и замена символов, назначенных строковой переменной.
  • Документация FFmpeg: Цитирование и экранирование - Подробности цитирования и экранирования, специфичные для ffmpeg .

РЕДАКТИРОВАТЬ: оригинальный код не будет работать, если вы встретите файл (или путь к файлу), который содержит ! символ, потому что отложенное расширение включено, а переменная FOR раскрывается до отложенного расширения. Так что имена с ! будет поврежден.

Это легко исправить, включив и выключив отложенное расширение внутри цикла, так что переменные FOR не раскрываются, пока включено отложенное расширение.

@echo off
setlocal disableDelayedExpansion
for /r %%f in (*.mkv) do (
  set _a=%%~nf
  set _c=%%f
  setlocal enableDelayedExpansion
  set _b=!_a:[=\[!
  set _name=!_b:]=\]!
  set _d=!_c:[=\[!
  set _fullname=!_d:]=\]!
  ffmpeg -i "!_fullname!" -vf subtitles="!_name!.mkv" -acodec copy "!_name!.mp4"
  endlocal
)
endlocal
pause

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