Я стараюсь избегать использования SETLOCAL enabledelayedexpansion ... ENDLOCAL
все (или почти все) время, потому что обычно я хочу установить или изменить несколько переменных и хочу, чтобы новые значения были доступны в других областях скрипта или после пакетасценарий заканчивается (SETLOCAL | ENDLOCAL забудет о любых новых переменных или изменениях переменных в части «SETLOCAL» сценария. Иногда это удобно, но для меня, как правило, нет.
В настоящее время я использую методописывается @ Zuzel , но прежде чем я узнал об этом методе, я использовал его, который очень похож (но выглядит немного сложнее):
for /F "usebackq delims=" %%f in (`echo set "a=^%a:%b%=%c%^%"`) do @%%f
пример сценария:
@echo off
set a=The fat cat
set b=fat
set c=thin
@echo.
@echo before: "%a%"
@echo replace "%b%" with "%c%" in "%a%" using for:
for /F "usebackq delims=" %%f in (`echo set "a=%%a:%b%=%c%%%"`) do @%%f
@echo after for: "%a%"
goto :EOF
вывод от запуска сценария:
before: "The fat cat"
replace "fat" with "thin" in "The fat cat" using for:
after for: "The thin cat"
Мне нравится этот метод, потому что вы можете вызывать внешние программы (или внутренние команды), используя измененные переменные, а также захватывать и обрабатывать выводкоманды (строка за строкой).
Но метод Зузеля проще и чище для большинства ситуаций, включая описанную вами.
Примечание:
Оба эти метода (и, конечно, SETLOCAL enabledelayedexpansion ... ENDLOCAL
) работают корректно, только если они запускаются из пакетного сценария.Если вы попытаетесь использовать любой из этих двух методов («call» или «for») непосредственно в окне командной строки, вы получите нечто отличное от того, что выводился из сценария.
Например,запустите это как скрипт:
@echo off
set a=The fat cat
set b=fat
set c=thin
set d=calico
set e=sleepy
@echo.
@echo before: "%a%"
@echo.
@echo replace "%b%" with "%c%" in "%a%" using call:
call set a=%%a:%b%=%c%%%
@echo after call: "%a%" ("%b%" to "%c%")
@echo.
@echo replace "%c%" with "%d%" in "%a%" using for:
for /F "usebackq delims=" %%f in (`echo set "a=%%a:%c%=%d%%%"`) do @%%f
@echo after for: "%a%" ("%c%" to "%d%")
@echo.
@echo replace "%d%" with "%e%" in "%a%" using call:
call set a=%%a:%d%=%e%%%
@echo after call: "%a%" ("%d%" to "%e%")
вывод от запуска скрипта:
before: "The fat cat"
replace "fat" with "thin" in "The fat cat" using call:
after call: "The thin cat" ("fat" to "thin")
replace "thin" with "calico" in "The thin cat" using for:
after for: "The calico cat" ("thin" to "calico")
replace "calico" with "sleepy" in "The calico cat" using call:
after call: "The sleepy cat" ("calico" to "sleepy")
Теперь запустите эти команды прямо в окне командной строки:
c:\>
c:\>set a=The fat cat
c:\>set b=fat
c:\>set c=thin
c:\>set d=calico
c:\>set e=sleepy
c:\>
c:\>@echo.
c:\>@echo before: "%a%"
before: "The fat cat"
c:\>@echo.
c:\>
c:\>@echo replace "%b%" with "%c%" in "%a%" using call:
replace "fat" with "thin" in "The fat cat" using call:
c:\>call set a=%%a:%b%=%c%%%
c:\>@echo after call: "%a%" ("%b%" to "%c%")
after call: "%The thin cat%" ("fat" to "thin")
c:\>
c:\>@echo.
c:\>@echo replace "%c%" with "%d%" in "%a%" using for:
replace "thin" with "calico" in "%The thin cat%" using for:
c:\>for /F "usebackq delims=" %f in (`echo set "a=%%a:%c%=%d%%%"`) do @%f
c:\>@echo after for: "%a%" ("%c%" to "%d%")
after for: "%%The calico cat%%" ("thin" to "calico")
c:\>
c:\>@echo.
c:\>@echo replace "%d%" with "%e%" in "%a%" using call:
replace "calico" with "sleepy" in "%%The calico cat%%" using call:
c:\>call set a=%%a:%d%=%e%%%
c:\>@echo after call: "%a%" ("%d%" to "%e%")
after call: "%%%The sleepy cat%%%" ("calico" to "sleepy")
c:\>
проверить строки вывода до и после из окна командной строки:
before: "The fat cat"
replace "fat" with "thin" in "The fat cat" using call:
after call: "%The thin cat%" ("fat" to "thin")
replace "thin" with "calico" in "%The thin cat%" using for:
after for: "%%The calico cat%%" ("thin" to "calico")
replace "calico" with "sleepy" in "%%The calico cat%%" using call:
after call: "%%%The sleepy cat%%%" ("calico" to "sleepy")
Обратите внимание, что замены сделаны правильно, но также обратите внимание, что при запуске этих команд непосредственно в окне командной строки, он добавляетнабор "%" (знаки процента) до и после ожидаемого значения каждый раз, когда производится замена.Таким образом, затрудняет тестирование любого из этих методов непосредственно в окне командной строки.