我根据我在其他地方找到的一些示例制作了一个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”的文件。
为了澄清我的意图,我想要代码:
答案 0 :(得分:0)
还不清楚Chapters
的线条是什么样的
假设值Subtitles
和for /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"
)
)
可能会更容易。