Windows批处理字符串替换在变量给出搜索字符串时不起作用

时间:2015-12-15 13:27:04

标签: windows batch-file cmd

我破坏了一些代码,这些代码应该删除名称不以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 - 循环仅用于浏览目录树。脚本的主要功能仍然是相同的。

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的错误(由于我的控制台是德语,因此是免费翻译)。

任何人都知道造成这种情况的原因是什么?

3 个答案:

答案 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