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