Windows: Как использовать «установить» с динамическим поиском и заменой? - PullRequest
7 голосов
/ 17 марта 2011

Я хочу использовать функцию поиска / замены команды 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, это нормально. В конце я хочу, чтобы переменная окружения содержала double-bar.

1 Ответ

7 голосов
/ 17 марта 2011

Есть два распространенных способа (и несколько необычных).

Используйте двойное расширение по вызову.

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!"
  )
)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...