是否可以将 FINDSTR 与变量而不是文件一起使用?
我已经尝试过研究这个,但我对批次的了解还不够好。
我已经使我的批处理文件的大部分工作完美无缺地满足了我的需要,但是我无法将字符串变量的一部分提取到新变量中。
原始变量例如是S02E12 - Charge!
。我想将02
提取到ep_seas
,将12
提取到ep_num
,将Charge!
提取到ep_name
。如果这是名称的确切模式,我现在就可以使用它,但是我遇到了一些这种模式的文件:S02E124 - Charge #2!
有没有办法可以动态获取我需要的值而不管它们的长度?
我的想法是使用 FINDSTR 在S
和E
之间搜索,然后在E
和空格
之间搜索(或{ {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个指定的字符作为分隔符。
02
的两个文件名,标记1为A
。12
表124
,A
之后分配给下一个循环变量的两个文件名的标记2为B
和Charge!
。< / LI>
Charge #2!
和C
用于分配给下一个但是一个循环变量for /F
的两个文件。您现在知道为什么循环变量区分大小写,而环境变量不区分大小写。指定的循环变量使用带有多个标记/子字符串的*
定义下一个循环变量所具有的字符。
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 Version
和B
以循环变量S03E48
。内部循环再次将03
拆分为分配给循环变量C
的{{1}}和分配给循环变量48
的{{1}}。
顺便说一下:Windows上的目录分隔符是D
而不是{/ 1}},就像在Unix / Linux / Mac上一样,尽管Windows内核函数也支持带有\
的文件/目录路径更正/
。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
/
\
call /?
echo /?
endlocal /?
for /?
goto /?
最后一点:
可以在环境变量上使用 FINDSTR ,例如:
set /?
但 FINDSTR 从不输出匹配的字符串。它总是输出包含找到的字符串的整行。因此 FINDSTR 对于将文件名拆分为单独的部分毫无帮助。