Windows批处理stringreplacesearchstring由variables给出时不起作用

我抹了一些代码,应该删除那些没有名字以keep的值开始的文件。 我通过将文件的名称放在tmpL1tmpL2同时replacekeep的值来实现这一点。 如果tmpL1tmpL2不同,我保留该文件,否则将被删除。

 setlocal enabledelayedexpansion set keep=[File I want to keep] for /F %%L IN ('dir /b *') do ( set tmpL1=%%L set tmpL2=!tmpL1:%keep%=! if !tmpL1!==!tmpL2! ( echo.[REMOVE] ) else ( echo.[KEEP] ) ) 

这工作正常。 但是,当我把这个代码放在一个更大的脚本中时,设置tmpL2突然停止工作。 而不是(文件名的一部分) tmpL2现在实际上包含了tmpL1:=

这里是我想要使用它的脚本。额外for循环只是为了通过一个目录树。 脚本的主要function还是一样的。

 setlocal enabledelayedexpansion for /F %%G in ('dir /b *-snapshots') do ( set tmpG1=%%G for /F %%H in ('dir /b !tmpG1!\*') do ( set tmpH1=%%H for /F %%I in ('dir /b !tmpG1!\!tmpH1!\*') do ( set tmpI1=%%I for /F %%J in ('dir /b !tmpG1!\!tmpH1!\!tmpI1!\*-SNAPSHOT') do ( set tmpJ1=%%J set tmpJ2=!tmpJ1:~0,8! for /F %%K in ('dir /b !tmpG1!\!tmpH1!\!tmpI1!\!tmpJ1!\*!tmpJ2!*.pom /O:N') do ( set tmp1=%%K ) set keep=!tmp1:.pom=! for /F %%L in ('dir /b !tmpG1!\!tmpH1!\!tmpI1!\!tmpJ1!\*!tmpJ2!*') do ( set tmpL1=%%L set tmpL2=!tmpL1:%keep%=! pause if !tmpL1!==!tmpL2! ( echo.[REMOVE] ) else ( echo.[KEEP] ) ) ) ) ) ) 

我也尝试了“懒”延迟扩展取代set tmpL2=!tmpL1:%keep%=!call set tmpL2=%%tmpL1:%keep%=%% 。 这也适用于小脚本,但是当我将其应用于大脚本时,出现像"=%" can't be syntactically processed in this location这样的错误"=%" can't be syntactically processed in this location (这是自由翻译,因为我的控制台是德语的)。

任何人有一个想法是什么造成这个?

你可以尝试改变这一行
set tmpL2=!tmpL1:%keep%=!

 FOR /F "delims=" %%R in (""!keep!"") do set "tmpL2=!tmpL1:%%~R=!" 
  set tmpL2=!tmpL1:%keep%=! 

for循环被解析时,由于keep在那个时候是undefined,所以这个会减少到

  set tmpL2=!tmpL1:=! 

代替:

 set tmpL2=!tmpL1:%keep%=! 

写:

 call :SUB tmpL2 !tmpL1! !keep! 

然后在脚本的底部,放置这个:

 goto :EOF :SUB return string search [replace] set "tmpSub=%2" set "%1=!tmpSub:%3=%4!" goto :EOF