批处理 - 不替换字符串

时间:2016-02-29 12:32:00

标签: windows batch-file

我有一个小批量脚本:

@echo off
cls
setlocal enabledelayedexpansion
SET BINARY_FILES=find_files.cmd;find_files2.cmd
pushd "%cd%"
call :listFiles
popd
goto :eof

:listFiles
    for /R "%cd%" %%i in ( *.cmd ) do (
        set "filen=%%~nxi"
        rem give me only the filename
        call :checkIfIsList !filen!
    )
    goto :eof

:checkIfIsList
    set "FILETOCHECK=%1"
    echo "FILETOCHECK: !FILETOCHECK!"
    echo "Output: %BINARY_FILES:!FILETOCHECK!=%"
    goto :eof

此脚本的输出类似于以下内容:

"FILETOCHECK: findstring.cmd"
"Output: find_files.cmd;find_files2.cmd"
"FILETOCHECK: find_files.cmd"
"Output: find_files.cmd;find_files2.cmd"
"FILETOCHECK: find_files2.cmd"
"Output: find_files.cmd;find_files2.cmd"
"FILETOCHECK: first.cmd"
"Output: find_files.cmd;find_files2.cmd"

问题是:我想,以“输出:...”开头的第二行只有这个输出

 "Output: ;find_files2.cmd"

为什么字符串替换不起作用?

2 个答案:

答案 0 :(得分:2)

你的正常和延迟扩张已经逆转。

正常%扩展在行解析的早期发生,并且在结束时发生延迟的!扩展。为了使查找/替换起作用,必须在查找/替换操作之前扩展查找字符串。所以你想要

echo "Output: !BINARY_FILES:%FILETOCHECK%=!%"

答案 1 :(得分:0)

您正在使用延迟扩展,但未启用它。将其添加为第一行:

setlocal enabledelayedexpansion