我整理了一些代码,该代码应该删除名称不以keep开头的文件。我通过将文件名放在tmpL1tmpL2中同时用什么都代替keep的值来实现这一点。如果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 -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=!"

10-08 05:13