【问题标题】:Windows: How to use "set" with dynamic search and replace?Windows:如何在动态搜索和替换中使用“set”?
【发布时间】:2011-07-17 06:47:55
【问题描述】:

我想以动态方式使用SET 命令的搜索/替换功能。

正常的方式是这样的

SET blah=double-foo
SET blah=%blah:foo=bar%

现在我想在第二行使用变量而不是foobar

SET search=foo
SET repl=bar
SET blah=double-foo

ECHO %blah%
SET blah=%blah:%search%=%repl%%
ECHO %blah%

我只会得到

double-foo
searchrepl%

我也试过

SET blah=%blah:(%search%=%repl%)%
SET blah=%blah:(%search%)=(%repl%)%

我将如何实现这一目标?如果我在没有SET 的情况下这样做,那很好。最后我希望环境变量保持double-bar

【问题讨论】:

    标签: windows batch-file environment-variables


    【解决方案1】:

    有两种常见的方式(有些不常见)。

    通过调用使用双重扩展。

    SET search=foo
    SET repl=bar
    SET blah=double-foo
    
    CALL SET blah=%%blah:%search%=%repl%%%
    

    在第一次“扫描”中,它扩展为CALL SET blah=%blah:foo=bar%,并且调用将秒时间扩展为所需的结果。

    第二种方式是延迟变种

    SETLOCAL EnableDelayedExpansion
    SET search=foo
    SET repl=bar
    SET blah=double-foo
    
    SET blah=!blah:%search%=%repl%!
    

    它有效,因为延迟扩展在百分比扩展之后执行。

    我更喜欢延迟变体,因为它对特殊字符更快更安全。

    一种不常见的方式是 FOR-Loop-Variable 变体,它也适用于搜索/替换变量中的特殊字符。

    SETLOCAL EnableDelayedExpansion
    SET "search=foo>"
    SET "repl=bar & bar"
    SET "blah=double-foo> &|<>"
    
    for %%s in ("!search!") do (
      for %%r in ("!repl!") do (
        SET "blah=!blah:%%~s=%%~r!"
      )
    )  
    

    【讨论】:

    • 延迟扩展也记录在案,而call 没有:-)
    • @Joey:是的,它是无证的,但call 的影响是众所周知的(双扩展,双插入符号和禁用延迟扩展)
    • +1 太棒了!对于那些关心的人:它也适用于批处理参数CALL SET blah=%%blah:%1=%2%%
    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 2017-01-05
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多