String 如何使用FINDSTR在变量的值中查找字符串?
是否可以将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
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使用指定的4个字符作为分隔符,将>编码为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
选项。