是否可以将 findstr 与变量而不是文件使用?
我已经尝试研究了这一点,但是我对批次的了解还不够。
我的大部分批处理文件都可以完美地完成我的需求,但是我很难将字符串变量的一部分提取到新变量中。
例如,原始变量为 S02E12 - Charge!
。我想将02
提取到ep_seas
,12
和ep_num
和Charge!
至ep_name
。如果这是名称的确切模式,我现在可以正常工作,但是我遇到了一些以这种模式的文件: S02E124 - Charge #2!
有没有办法动态地获得所需的值,无论其长度如何?
我的想法是使用 findstr 在S
和E
之间搜索,然后在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是
02
,对于分配给指定循环变量A
的两个文件名。 - 令牌2是
12
和124
,对于根据ASCII表,在A
之后分配给NEXT LOOP变量的两个文件名是B
。 - 令牌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
分配给循环变量A
和Extended Version
到LOOP变量B
。内部循环再次将S03E48
分为03
,分配给循环变量C
和48
分配给LOOP变量D
。
顺便说一句:Windows上的目录分离器是 ,而不是
/
,虽然Windows内核函数也支持使用/
的文件/目录路径,但具有自动校正为。
用于了解使用的命令及其工作方式,打开命令提示符窗口,执行以下命令,并完全仔细阅读所有命令显示的所有帮助页面。
-
call /?
-
echo /?
-
endlocal /?
-
for /?
-
goto /?
-
set /?
-
setlocal /?
最后一个注:
可以在环境变量上使用 findstr ,例如:
echo %ep% | findstr /R "^S[0123456789][0123456789]"
但 findstr 永远不会仅输出匹配的字符串。它始终输出包含找到的字符串的整个线。因此