批处理文件:用regex评估命令输出?

时间:2018-05-27 18:36:21

标签: regex batch-file find

我根据我在其他地方找到的一些示例制作了一个Windows批处理文件。 它的作用是解析特定文件类型(.mkv)的文件夹,然后从MKVToolNix文件夹运行mkvmerge.exe。 该命令生成一个输出,列出容器中的不同轨道。

该文件的核心是

 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!
     )
   )
 )

上面的示例只是文件的一部分,root文件夹设置为我想要解析的文件夹,当然,在找到包含章节的文件后,它将运行其他命令。 这一切都很好,但我也想同时检查字幕。 find命令不采用正则表达式,或者我可以添加“章节字幕”。我使用其他命令(如findstr)的努力并没有真正起作用。 我如何在这里使用RegEx?

这是一个示例输出,在.mkv文件上运行mkvmerge.exe

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

此示例包含字幕和章节轨道,批处理文件将找到关键字“章节”(设置为忽略大小写)。即使没有章节,我也想要捕获包含关键字“subtitles”的文件。

为了澄清我的意图,我想要代码:

  • 解析给定文件夹
  • 对于所有.mkv文件,请执行 mkvmerge / i ,它将输出(作为文本)该文件中的流
  • 查看该输出,如果它包含单词“chapters”和/或“subtitles”会触发一些操作。

3 个答案:

答案 0 :(得分:0)

还不清楚Chapters的线条是什么样的 假设值Subtitlesfor /f出现在第1列中 ^将冒号和空格处的行(相邻的delims计为1)拆分为标记1 = %% b和2 = %% c标记3中可能未拆分的休息= %% d 在行开始处锚定:: 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 ) ) 的空格分隔(ORed)RegEx搜索词仅匹配章节/副标题。

 $arr = json_encode(array('priority'=>$priority,'status'=>$status,'type'=>$type));
         return $arr;

答案 1 :(得分:0)

感谢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.
    )
)

我需要的只是检查我的一个关键字是否出现在任何一个标记中,然后相应地设置一个标记,然后在循环后执行相应的操作,重置下一个文件的标记。

答案 2 :(得分:0)

由于您似乎没有区分是检测到一个字符串还是另一个字符串(或两者),所以

@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"
 )
)

可能会更容易。