Пакетный файл: оценка вывода команды с помощью регулярного выражения? - PullRequest
0 голосов
/ 27 мая 2018

Я создал командный файл Windows на основе некоторых примеров, которые я нашел в другом месте.Он анализирует папку для определенного типа файла (.mkv), а затем запускает mkvmerge.exe из папки MKVToolNix.Команда производит вывод, перечисляя различные дорожки в контейнере.

Ядром файла является

 set rootfolder="Z:\Movies"
 for /r %rootfolder% %%a in (*.mkv) do (
   for /f %%b in ('mkvmerge -i "%%a" ^| find /c /i "chapters"') do (
     if [%%b]==[0] (
       echo "%%a" has no chapters
     ) else (
       echo Doing some interesting stuff!
     )
   )
 )

Приведенный выше пример является частью файла, корневая папка установлена ​​вРазумеется, я хочу проанализировать папку, и, найдя файл с главами, он запустит дополнительные команды.Все это прекрасно работает, но я также хочу проверить субтитры одновременно.Команда find не принимает регулярные выражения, иначе я мог бы просто добавить «субтитры глав».Мои попытки использовать другие команды, такие как findstr, на самом деле не сработали.Как мне использовать RegEx здесь?

Это пример выходного файла, запускающий mkvmerge.exe для файла .mkv

mkvmerge.exe -i "Snow White and the Seven Dwarfs (1937) [tt0029583].mkv"
File 'Snow White and the Seven Dwarfs (1937) [tt0029583].mkv': container: Matroska
Track ID 0: video (MPEG-4p10/AVC/h.264)
Track ID 1: audio (DTS)
Track ID 2: audio (AC-3)
Track ID 3: subtitles (HDMV PGS)
Track ID 4: subtitles (HDMV PGS)
Chapters: 26 entries

В этом примере содержатся дорожки субтитров и глав, а также пакетФайл найдет ключевое слово "главы" (он установлен, чтобы игнорировать регистр).Я также хочу перехватить файлы, которые содержат ключевое слово «субтитры», даже если нет глав.

Чтобы прояснить свои намерения, я хочу, чтобы код:

  • Выполнить анализ черезуказанная папка
  • Для всех файлов .mkv выполните mkvmerge / i , которая выведет (в виде текста) потоки в этом файле
  • Посмотрите на этот вывод и, если онсодержит слово (а) "главы" и / или "субтитры", вызывающие некоторые действия.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Спасибо LotPings за ваши усилия.Я узнал кое-что о токенах, которые будут очень полезны.Ваш сценарий также дал мне правильный путь (изучая еще несколько команд по пути.

Ваш сценарий в итоге выглядел так:

:: Q:\Test\2018\05\27\SO_50555308.cmd
@Echo off
set rootfolder="Z:\Movies"
for /r %rootfolder% %%a in (*.mkv) do (
    set "found="
    for /f "tokens=1-4* delims=: " %%b in (
        'mkvmerge -i "%%a" ^| findstr /i "^Chapters subtitles"'
    ) do (
        if /i "%%b"=="Chapters" set found=1
        if /i "%%e"=="subtitles" set found=1
    )
    if defined found (
        echo Chapters or subs found in "%%a"
    ) else (
        echo.
    )
)

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

0 голосов
/ 28 мая 2018

Поскольку вы, похоже, не различаете, обнаружена ли одна строка или другая (или обе), то

@Echo off
set rootfolder="Z:\Movies"
for /r %rootfolder% %%a in (*.mkv) do (
 mkvmerge -i "%%a" | findstr /i "^Chapters subtitles" >nul
 if errorlevel 1 (
  echo Neither Chapters nor subs found in "%%a"
 ) else (
  echo Chapters or subs found in "%%a"
 )
)

, вероятно, будет проще.

0 голосов
/ 27 мая 2018

Все еще неясно, как будет выглядеть строка с Subtitles.
Предполагая, что значения Chapters и Subtitles появляются в 1-м столбце
for /f разделяет строки на двоеточие и пробел (соседние разделители)считать как один) в токены 1 = %% b и 2 = %% c возможный неразделенный остаток в токене 3 = %% d Разделенные пробелами (ORed) поисковые слова RegEx, закрепленные ^ в начале строки, будут соответствовать только главам / субтитрам,

:: Q:\Test\2018\05\27\SO_50555308.cmd
@Echo off
set rootfolder="Z:\Movies"
for /r %rootfolder% %%a in (*.mkv) do (
    for /f "tokens=1-4* delims=: " %%b in (
        'mkvmerge -i "%%a" ^| findstr /i "^Chapters subtitles"'
    ) do (
        if /i "%%b"=="Chapters" if "%%c"=="0" (
            echo "%%a" has no chapters
        ) else (
            echo "%%a" has %%c chapters
            echo Doing some interesting stuff!
        )
        if /i "%%e"=="subtitles" echo "%%a" %%b %%b %%d: %%e %%f
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...