Windows:如何使用动态搜索和替换"设置"?

sjn*_*ngm 7 windows batch-file environment-variables

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

通常的方式是这样的

SET blah=double-foo
SET blah=%blah:foo=bar%
Run Code Online (Sandbox Code Playgroud)

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

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

ECHO %blah%
SET blah=%blah:%search%=%repl%%
ECHO %blah%
Run Code Online (Sandbox Code Playgroud)

我只能得到

double-foo
searchrepl%
Run Code Online (Sandbox Code Playgroud)

我也试过了

SET blah=%blah:(%search%=%repl%)%
SET blah=%blah:(%search%)=(%repl%)%
Run Code Online (Sandbox Code Playgroud)

我怎么做到这一点?如果我这样做没有SET那么好.最后,我想要保持环境变量double-bar.

jeb*_*jeb 7

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

通过调用使用双扩展.

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

CALL SET blah=%%blah:%search%=%repl%%%
Run Code Online (Sandbox Code Playgroud)

在第一个"扫描"中,它会扩展到CALL SET blah=%blah:foo=bar%,并且调用会将秒时间扩展到所需的结果.

第二种方式是延迟变种

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

SET blah=!blah:%search%=%repl%!
Run Code Online (Sandbox Code Playgroud)

它起作用,因为在扩展百分比之后执行延迟扩展.

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

一种不常见的方法是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!"
  )
)  
Run Code Online (Sandbox Code Playgroud)