Есть два распространенных способа (и несколько необычных).
Используйте двойное расширение по вызову.
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!"
)
)