Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何使用FINDSTR在变量的值中查找字符串?_String_Batch File_Cmd - Fatal编程技术网

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

String 如何使用FINDSTR在变量的值中查找字符串?,string,batch-file,cmd,String,Batch File,Cmd,是否可以将FINDSTR与变量而不是文件一起使用 我已经尝试过研究这个,但我对批处理的知识还不够好 我已经使我的批处理文件的大部分工作完美无瑕地满足了我的需要,但是我很难将字符串变量的一部分提取到新变量中 例如,原始变量是S02E12-Charge。我想提取02到ep_seas,12到ep_num,以及费用至ep\U名称。如果这是确切的名称模式,我现在就可以使用它,但是我遇到了一些这样的文件:S02E124-Charge#2 是否有一种方法可以动态获取所需的值,而不考虑其长度 我的想法是使用FI

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

我已经尝试过研究这个,但我对批处理的知识还不够好

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

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

是否有一种方法可以动态获取所需的值,而不考虑其长度

我的想法是使用FINDSTR
S
E
之间搜索,然后在
E
和空格
(或
-
)之间搜索,然后在
-
和结尾之间搜索。不过,我不确定我将如何进行这项工作

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

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%\MKVToolNix\mkvmerge.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
此处使用的/F命令解析双引号中的字符串,即文件名

选项
“tokens=1,2*delims=ES-”
会将文件名字符串拆分
S02E12-Charge和<代码>S02E124-费用#2编码为3个子字符串

  • 对于分配给指定循环变量
    A
    的两个文件名,标记1都是
    02
  • 根据
    B
    表,对于分配给
    A
    之后的下一个循环变量的两个文件名,标记2为
    12
    124
  • 令牌3是令牌2后面的分隔符后面的所有内容,即
    Charge
    收费#2用于分配给下一个但只有一个循环变量的两个文件
    C
  • 现在您知道了为什么循环变量区分大小写,而环境变量不区分大小写。指定的循环变量定义下一个循环变量在使用带有多个令牌/子字符串的
    for/F
    时具有的字符

    *
    附加到标记号X意味着子字符串X后的分隔符后面的字符串/行的其余部分应分配给下一个循环变量,而无需进一步拆分分隔符。因此,
    S02E12-
    S02E124-
    之后的字符串也可以包含分隔符,尽管如此,还是完全分配给循环变量
    C

    请注意,连字符和空格后以E或S开头的字符串也被解释为分隔符,因此在分配给循环变量
    C
    的字符串中丢失。子例程
    merge
    中的FOR循环可以替换为以下代码,以获得文件名的工作解决方案,如
    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
    分配给循环变量
    A
    ,将
    扩展版本
    分配给循环变量
    B
    。内部循环再次拆分为分配给循环变量
    C
    03
    和分配给循环变量
    D
    48

    顺便说一下:Windows上的目录分隔符是
    \
    ,而不是Unix/Linux/Mac上的
    /
    ,尽管Windows内核函数也支持带有
    /
    的文件/目录路径,并自动更正为
    \

    要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

    • 呼叫/?
    • echo/?
    • endlocal/?
    • 获取/?
    • goto/?
    • 设置/?
    • setlocal/?
    最后一点注意:

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

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

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

    请阅读
    for/F
    命令和
    DELIMS
    选项。