我想以动态方式使用SET命令的搜索/替换功能.
通常的方式是这样的
- SET blah=double-foo
- SET blah=%blah:foo=bar%
现在我想在第二行使用变量而不是foo和bar:
- 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,那很好.最后,我希望环境变量保持双杠.
有两种常见的方式(有些不常见).
通过调用使用双扩展.
- 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!"
- )
- )