Замените специальные символы в программе пакетной подачи файлов ffmpeg - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь написать пакетный файл, который использует ffmpeg.exe для преобразования всех файлов в структуре папок в формат mp3 (в частности, 128 Кбит / с).

Мой пакетный файл в настоящее время не может обрабатывать имена файлов (составленные путем объединения переменных %_SOURCE% и %%~F), содержащие определенные специальные символы, генерирующие следующие ошибки:

Нет такого файла или каталога

  • многоточие
  • en dash
  • em dash
  • знак минус

Неверный аргумент

  • и изогнутые одинарные кавычки
  • и изогнутые двойные кавычки

Недопустимый аргумент (но иногда проходит в зависимости от того, где символ находится в имени файла, например, кажется, работает, если поместить между n и t из Dont в C:\Users\Test\Documents\Input\Peter Bjorn And John - I Know You Dont Love Me.mp3)

  • - дефис
  • ! восклицательный знак
  • ~ тильда
  • ' не изогнутые одинарные кавычки
  • = знак равенства
  • + знак плюс
  • % знак процента
  • ( открытый кронштейн

Как я могу изменить свой скрипт пакетного файла, чтобы переменная %%~F правильно экранировала эти символы?

Пример ввода текущего имени файла: C:\Users\Test\Documents\Input\Peter Bjorn And John - I Know You Don't Love Me.mp3

Пример ввода желаемого имени файла: C:\Users\Test\Documents\Input\Peter Bjorn And John - I Know You Don"^'"t Love Me.mp3

Сценарий (см. Начало строки C:\ffmpeg\bin\ffmpeg.exe):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_SOURCE=C:\Users\Test\Documents\Input" & rem // (absolute source path)
set "_TARGET=C:\Users\Test\Documents\Output"  & rem // (absolute target path)
set "_PATTERN=*.*" & rem // (pure file pattern for input files)
set "_FILEEXT=.mp3"   & rem // (pure file extension of output files)

pushd "%_TARGET%" || exit /B 1
for /F "delims=" %%F in ('
    cd /D "%_SOURCE%" ^&^& ^(rem/ list but do not copy: ^
        ^& xcopy /L /S /Y /I ".\%_PATTERN%" "%_TARGET%" ^
        ^| find ".\" ^& rem/ remove summary line;
    ^)
') do (
    2> nul mkdir "%%~dpF."

    rem // Set up the correct `ffmpeg` command line here:
    set "FFREPORT=file=C\:\\Users\\Test\\Documents\\Output\\ffreport-%%~F.log:level=32"
    "C:\ffmpeg\bin\ffmpeg.exe" -report -n -i "%_SOURCE%\%%~F" -vn -c:a libmp3lame -b:a 128k "%%~dpnF%_FILEEXT%"
    if not errorlevel 1  if exist "%%~dpnF%_FILEEXT%" del /f /q "%_SOURCE%\%%~F"

)
popd

endlocal
pause

1 Ответ

0 голосов
/ 08 января 2019
@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants:
set "_SOURCE=C:\Users\Test\Documents\Input" & rem // (absolute source path)
set "_TARGET=C:\Users\Test\Documents\Output"  & rem // (absolute target path)
set "_PATTERN=*.*" & rem // (pure file pattern for input files)
set "_FILEEXT=.mp3"   & rem // (pure file extension of output files)

pushd "%_TARGET%" || exit /B 1

for /r "%_SOURCE%" %%F in ("%_PATTERN%") do (
    set "_fullpath=%%~F"
    set "_filename=%%~nF"
    call :ffmpeg
)

popd

endlocal
pause
exit /b


:ffmpeg
setlocal EnableDelayedExpansion

rem // Get target path and log path:
for %%A in ("!_fullpath:%_SOURCE%=.!") do (
    set "_logpath=%%~dpAffreport-!_filename!.log"
    set "_targetpath=%%~dpA"
)

for %%A in (_logpath _targetpath) do if not defined %%A (
    echo  ERROR: %%A not defined.
    exit /b 1
)

rem // Escape logpath:
set "_logpath=!_logpath:\=\\!"
set "_logpath=!_logpath::=\:!"
set "_logpath=!_logpath:'=\'!"
set "_logpath=!_logpath:%%=%%%%!"

rem // Set FFREPORT:
set "FFREPORT=file=!_logpath!:level=32"

rem // Make dir for the target file:
if not exist "!_targetpath!" md "!_targetpath!"

rem // Run ffmpeg command:
"C:\ffmpeg\bin\ffmpeg.exe" -hide_banner -report -n -i "!_fullpath!" -vn -c:a libmp3lame -b:a 128k "!_targetpath!\!_filename!%_FILEEXT%"
if not errorlevel 1 if exist "!_targetpath!\!_filename!%_FILEEXT%" del /f /q "!_fullpath!"

exit /b 0

Использование for /f с командой приводит к изменению имен файлов, если содержит расширенный ASCII, такой как многоточие.

Использование for /r для итерации файлов дает лучшие результаты и скорректировали код для обработки изменения.

Добавлена ​​метка :ffmpeg для облегчения работы с переменные с отложенным расширением и т. д.

Добавлена ​​_logpath переменная для хранения пути к файлу журнала с любым обратная косая черта, двоеточие или одинарные кавычки, которые должны быть экранированы обратной косой чертой Знаки процента избегаются путем удвоения.

Добавлена ​​_targetpath переменная для хранения пути к ffmpeg это для вывода файла. Используется командой md для создания каталога структура, как у входа.

Это может решить не все проблемы. Пытался обойтись без промедления расширение, хотя всегда было несколько сбоев в зависимости от специальных символы, т.е. %.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...