我破坏了一些代码,这些代码应该删除名称不以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
- 循环仅用于浏览目录树。脚本的主要功能仍然是相同的。
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
的错误(由于我的控制台是德语,因此是免费翻译)。
任何人都知道造成这种情况的原因是什么?
答案 0 :(得分:3)
您可以尝试更改此行
set tmpL2=!tmpL1:%keep%=!
带
FOR /F "delims=" %%R in (""!keep!"") do set "tmpL2=!tmpL1:%%~R=!"
答案 1 :(得分:2)
set tmpL2=!tmpL1:%keep%=!
当解析for
循环时,由于keep
当时未定义,因此将减少为
set tmpL2=!tmpL1:=!
答案 2 :(得分:1)
而不是:
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