Как я могу ссылаться на часть имени файла в цикле FOR?

#string #parsing #batch-file

Вопрос:

Попытка совместить видео и аудио с помощью FFMPEG и петли FOR. У меня есть папка, полная файлов, которые выглядят так

 movie1_audio.m4a
movie1_video.mp4
movie2_audio.m4a
movie2_video.mp4
 

Мне нужен способ ссылаться только на все до подчеркивания, а не на все имя файла. Приведенный ниже скрипт ищет совпадающие файлы .mp4 и .m4a с одинаковыми именами для сопоставления. Я пытаюсь изменить его, чтобы искать файлы с одинаковыми именами перед символом подчеркивания.

 FOR %%A IN (*.mp4) DO (
    ffmpeg -i "%%~nA.mp4" -i "%%~nA.m4a" -vcodec copy -acodec copy -movflags faststart "output%%~nA.mp4"
)
 

Я знаю, что могу пакетно переименовывать свои файлы, чтобы легко решить эту проблему, но если есть способ просматривать только первую часть имени файла в пакетном режиме, я думаю, что эти знания могут быть полезны в будущих проектах. Спасибо!

Комментарии:

1. Я бы использовал шаблон movie*_*.* , чтобы не совпадать с непреднамеренными файлами…

Ответ №1:

Вам просто нужна другая вложенная команда FOR, которая использует несколько ее опций. Я не знаю, как вам нужно вписаться в вашу команду FFMPEG, поэтому я оставляю это на ваше усмотрение.

 @echo off
FOR %%A IN (*.mp4) DO (
    FOR /F "tokens=1,* delims=_" %%G IN ("%%~A") DO (
        REM %%G will be the file name before the underscore.
        REM %%H will be everything after the underscore
        ffmpeg ......
    )
)
 

Комментарии:

1. Потрясающе, это сработало! Вот мой последний код FOR %%A IN (*.mp4) DO ( echo Creating "%%~A.mp4" FOR /F "tokens=1,* delims=_" %%G IN ("%%~A") DO ( ffmpeg -i "%%G_video.m4a" -i "%%G_audio.m4a" -vcodec copy -acodec copy -movflags faststart "output%%G.mp4" )