我整理了一些代码,该代码应该删除名称不以keep
开头的文件。我通过将文件名放在tmpL1
和tmpL2
中同时用什么都代替keep
的值来实现这一点。如果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
-loops仅用于遍历目录树。该脚本的主要功能仍然相同。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
的错误(这是免费翻译,因为我的控制台是德语)。任何人都知道是什么原因造成的吗?
最佳答案
您可以尝试更改此行set tmpL2=!tmpL1:%keep%=!
和
FOR /F "delims=" %%R in (""!keep!"") do set "tmpL2=!tmpL1:%%~R=!"