Я пытаюсь написать пакетный файл, который использует 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