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



是否可以将 findstr 与变量而不是文件使用?

我已经尝试研究了这一点,但是我对批次的了解还不够。

我的大部分批处理文件都可以完美地完成我的需求,但是我很难将字符串变量的一部分提取到新变量中。

例如,原始变量为 S02E12 - Charge!。我想将02提取到ep_seas12ep_numCharge!ep_name。如果这是名称的确切模式,我现在可以正常工作,但是我遇到了一些以这种模式的文件: S02E124 - Charge #2!

有没有办法动态地获得所需的值,无论其长度如何?

我的想法是使用 findstr SE之间搜索,然后在E和Space  (或-)之间,然后在-和末端之间进行搜索。我不确定如何继续这样做。

有人有我可以研究的解决方案还是有人提供例子?

setlocal DisableDelayedExpansion
set mkvmerge="C:/Program Files/MKVToolNix/mkvmerge.exe"
set "output_folder=%cd%Muxing"
for /r %%a in (*.mkv) do (
    set fi=%%a
    set ep=%%~na
    call :merge
)
goto :eof
:merge
set ep_name=%ep:~9%
set ep_num=%ep:~4,2%
set ep_seas=%ep:~2,1%
call %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

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

@echo off
setlocal EnableExtensions DisableDelayedExpansion
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"
)
"%ProgramFiles%MKVToolNixmkvmerge.exe" -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. 令牌1是02,对于分配给指定循环变量A的两个文件名。
  2. 令牌2是12124,对于根据ASCII表,在A之后分配给NEXT LOOP变量的两个文件名是B
  3. 令牌3是在"标记2"之后的分界符之后的所有内容,它为Charge!Charge #2!,分配给下一个文件,但一个循环变量C

您现在知道为什么循环变量对大小写敏感,而环境变量不对大小写敏感。指定的循环变量定义了下一个循环变量在使用具有多个令牌/子字符串的for /F时具有哪些字符。

*附加到令牌号码 x 表示在substring x> x 之后的字符串/行之后,应分配给下一个loop able,而无需在分界数上进行任何进一步的分散分配程序。因此,S02E12 - S02E124 - 之后的字符串也可以包含定界符字符,但是已完全分配给循环变量C

请注意,连字符和空间以E或S开头的字符串也被解释为定界线,因此在分配给循环变量C的字符串中缺少。可以通过以下代码替换 loop merge中的循环以获取诸如 S03E48 - Extended Version.mkv之类的文件名的工作解决方案。

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分配给循环变量AExtended Version到LOOP变量B。内部循环再次将S03E48分为03,分配给循环变量C48分配给LOOP变量D

顺便说一句:Windows上的目录分离器是 ,而不是 /,虽然Windows内核函数也支持使用/的文件/目录路径,但具有自动校正为

用于了解使用的命令及其工作方式,打开命令提示符窗口,执行以下命令,并完全仔细阅读所有命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • set /?
  • setlocal /?

最后一个注:

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

echo %ep% | findstr /R "^S[0123456789][0123456789]"

findstr 永远不会仅输出匹配的字符串。它始终输出包含找到的字符串的整个线。因此

最新更新