【问题标题】:Batch - string is not replaced批处理 - 不替换字符串
【发布时间】:2016-02-29 22:16:44
【问题描述】:

我有一个小批量脚本:

@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"

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

【问题讨论】:

  • 这个管理在this answer有充分的解释:“要解决这个问题你必须使用延迟扩展,即在开头插入setlocal EnableDelayedExpansion命令,用百分比括起来替换变量,然后将感叹号中的原始变量:echo "Output: !BINARY_FILES:%FILETOCHECK%=!"

标签: windows batch-file


【解决方案1】:

你的正常扩张和延迟扩张被逆转了。

正常的% 扩展发生在行解析的早期,延迟! 扩展发生在最后。为了使查找/替换工作,查找字符串必须在查找/替换操作之前展开。所以你想要

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

【讨论】:

    【解决方案2】:

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

    setlocal enabledelayedexpansion
    

    【讨论】:

    • 这也行不通。其实这是我的脚本的一部分,但是我忘了在这里添加到stackoverflow。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2014-05-30
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多