我想以动态方式使用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,那很好.最后,我希望环境变量保持双杠.
有两种常见的方式(有些不常见).
原文链接:https://www.f2er.com/windows/364627.html通过调用使用双扩展.
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!" ) )