如何使用FINDSTR查找变量值的字符串?

时间:2017-10-03 21:16:59

标签: string batch-file cmd

是否可以将 FINDSTR 与变量而不是文件一起使用?

我已经尝试过研究这个,但我对批次的了解还不够好。

我已经使我的批处理文件的大部分工作完美无缺地满足了我的需要,但是我无法将字符串变量的一部分提取到新变量中。

原始变量例如是S02E12 - Charge!。我想将02提取到ep_seas,将12提取到ep_num,将Charge!提取到ep_name。如果这是名称的确切模式,我现在就可以使用它,但是我遇到了一些这种模式的文件:S02E124 - Charge #2!

有没有办法可以动态获取我需要的值而不管它们的长度?

我的想法是使用 FINDSTR SE之间搜索,然后在E和空格 之间搜索(或{ {1}}),然后在-和结束之间。我不知道如何继续这样做。

有没有人有我可以研究的解决方案,或者有人可以提供一个例子吗?

-

1 个答案:

答案 0 :(得分:2)

您可以将此代码用于您的任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "mkvmerge=%ProgramFiles%\MKVToolNix\mkvmerge.exe"
set "output_folder=%CD%\Muxing"
for /R %%I in (*.mkv) do (
    set "fi=%%I"
    set "ep=%%~nI"
    call :merge
)
goto :EOF

:merge
for /F "tokens=1,2* delims=ES- " %%A in ("%ep%") do (
    set "ep_seas=%%A"
    set "ep_num=%%B"
    set "ep_name=%%C"
)
"%mkvmerge%" -o "%output_folder%\%ep%.mkv" --track-name "0:%ep_name%" --language 0:und --default-track 0:yes --track-name "1:[JAP]" --language 1:jpn --default-track 1:yes --track-name "2:[ENG]" --language 2:eng --default-track 2:yes --forced-track 2:yes "%fi%" --track-order 0:0,0:1,0:2 --title "Fate Zero - Episode %ep_num%"
goto :EOF

此处使用的命令 FOR / F 用双引号解析字符串,即文件名。

选项"tokens=1,2* delims=ES- "会导致将文件名字符串S02E12 - Charge!S02E124 - Charge #2!拆分为3个子字符串,使用4个指定的字符作为分隔符。

  1. 对于分配给指定循环变量02的两个文件名,标记1为A
  2. 根据12124A之后分配给下一个循环变量的两个文件名的标记2为BCharge!。< / LI>
  3. 令牌3是令牌2之后的分隔符之后的所有内容,Charge #2!C用于分配给下一个但是一个循环变量for /F的两个文件。
  4. 您现在知道为什么循环变量区分大小写,而环境变量不区分大小写。指定的循环变量使用带有多个标记/子字符串的*定义下一个循环变量所具有的字符。

    附加到标记号 X

    S02E12 - 表示在子字符串 X 之后的分隔符之后的字符串/行的其余部分应分配给下一个循环变量而没有任何进一步分裂分隔符。因此,S02E124 - C之后的字符串也可以包含分隔符字符,但仍然完全分配给循环变量C

    请注意,在连字符和空格后以E或S开头的字符串也被解释为分隔符,因此在分配给循环变量merge的字符串中缺失。子例程S03E48 - Extended Version.mkv中的 FOR 循环可以替换为以下代码,以获取文件名for /F "tokens=1* delims=- " %%A in ("%ep%") do ( set "ep_name=%%B" for /F "tokens=1,2 delims=ES" %%C in ("%%A") do ( set "ep_seas=%%C" set "ep_num=%%D" ) ) 的工作解决方案。

    S03E48

    外部循环将A分配给循环变量Extended VersionB以循环变量S03E48。内部循环再次将03拆分为分配给循环变量C的{​​{1}}和分配给循环变量48的{​​{1}}。

    顺便说一下:Windows上的目录分隔符是D而不是{/ 1}},就像在Unix / Linux / Mac上一样,尽管Windows内核函数也支持带有\的文件/目录路径更正/

    要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

    • /
    • \
    • call /?
    • echo /?
    • endlocal /?
    • for /?
    • goto /?

    最后一点:

    可以在环境变量上使用 FINDSTR ,例如:

    set /?

    FINDSTR 从不输出匹配的字符串。它总是输出包含找到的字符串的整行。因此 FINDSTR 对于将文件名拆分为单独的部分毫无帮助。