Batch file 用延迟扩展变量替换子字符串

Batch file 用延迟扩展变量替换子字符串,batch-file,cmd,Batch File,Cmd,我试图通过比较原始字符串和替换字符串(从中扣除子字符串)来计算许多变量。它确实适用于正则变量%var%的情况,并且不需要使用延迟扩展,但是有没有办法使它适用于延迟扩展变量!瓦尔!而不是使用第二个FOR循环?下面的代码无法计算pat#变量。我确实意识到,它们可以使用不同的方法进行计数,但这只是一个例子来说明我关于替换子字符串的问题 @echo off setlocal EnableExtensions EnableDelayedExpansion set "pat1=A" & set "p

我试图通过比较原始字符串和替换字符串(从中扣除子字符串)来计算许多变量。它确实适用于正则变量%var%的情况,并且不需要使用延迟扩展,但是有没有办法使它适用于延迟扩展变量!瓦尔!而不是使用第二个FOR循环?下面的代码无法计算pat#变量。我确实意识到,它们可以使用不同的方法进行计数,但这只是一个例子来说明我关于替换子字符串的问题

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "pat1=A" & set "pat2=B" & set "pat3=C" & set "pat4=D" & set "pat5=E"
set "pat6=F" & set "pat7=G" & set "pat8=H" & set "pat9=I" & set "pat10=J"
set "patn=;0;1;2;3;4;5;6;7;8;9;"

if not defined patc (
    for /f %%l in ('set pat') do (
        set "patl=%%l" & set "patl=!patl:~3,1!"
        if not "!patn:;!patl!;=!"=="%patn%" (set /a "patc+=1" & echo !patc!)))
exit /b

您需要使用某种双重扩展。
对于参数可能有
调用

....
set "patl=%%l" & set "patl=!patl:~3,1!" & echo ;!patl!;
call echo %%patn:;!patl!;=%%

or

FOR /F "delims=" %%S in ("!patn!") do (
    echo !patn:;%%S;=!
)

不能对延迟展开变量中的搜索(和替换)字符串使用延迟展开;您可以使用以下解决方法:
for/F“delims=“%%S in”(“!search_string!”)do echo!变量:%%S=延迟扩展的子字符串是否可以在正则变量中使用?比如:
如果不是“%patn:;!patl!;=%”“==“%patn%”
它对我也不起作用。不!您需要确保子字符串在变量之前展开;因此,可以立即展开子字符串(
%
)并延迟变量(
),但反之亦然……谢谢!对于未来的读者,这里有一些可以避免额外交互的工作代码:当然,在下面的代码中,IF NOT可以从新行开始,但在注释代码格式中似乎不起作用:
For/f%%l in('set pat')do(set“patl=%%l”&set“patl=!patl:~3,1!”&call set“patm=%%patn:;!patl!=%%”&IF NOT patm!=%patm!=%patn%(设置/a“patc+=1”&echo!patc!)
此外,已知的替代方法是:
对于/f“delims=0123456789”%%m In(“!patl!”)do(设置“var=%%m”)&如果未定义var(设置/a“patc+=1”)