Как заменить содержимое переменной в командном файле Windows
Я пишу простой скрипт для замены текста 9X_batch-file в переменной среды другим текстом. Проблема, которую 9X_windows-application я получаю, заключается в том, что замещенный 9X_batch-script или замещенный текст извлекается из других 9X_windows-application переменных
SET a=The fat cat
ECHO %a%
REM Results in 'The fat cat'
ECHO %a:fat=thin%
REM Results in 'The thin cat'
Работает нормально (вывод - «Толстый 9X_cmd.exe кот» и «Худой кот»
Однако, если в переменных 9X_windows-programming указано «толстый» или «тонкий», это не сработает
SET b=fat
ECHO %a:%c%=thin%
REM _Should_ give 'The thin cat'.
REM _Actually_ gives '%a:fat=thin%' (the %c% is evaluated, but no further).
REM using delayed evaluation doesn't make any difference either
ECHO !a:%c%=thin!
REM Actual output is now '!a:fat=thin!'
Я 9X_dos-batch знаю, что это можно сделать, поскольку раньше 9X_dos-batch видел это в блогах, но я никогда не сохранял 9X_cmd.exe ссылку на блоги.
У кого-нибудь есть идеи?
PS. Я 9X_windows-application запускаю скрипты в Windows 7
PPS. Я знаю, что 9X_bat это проще в Perl / Python / другом выбранном 9X_batch-files языке сценариев, но я просто хочу знать, почему 9X_batch-files то, что должно быть простым, не сразу становится 9X_windows-applications очевидным.
PPPS. Я также пробовал скрипты 9X_windows-application с явным включением отложенного раскрытия
SETLOCAL enabledelayedexpansion
Это 9X_windows-application не имеет значения.
Ответ #1
Ответ на вопрос: Как заменить содержимое переменной в командном файле Windows
Попробуйте следующее:
Скопируйте и вставьте 9X_cmd.exe код в Блокнот и сохраните его как пакетный 9X_windows файл.
@echo off
setlocal enabledelayedexpansion
set str=The fat cat
set f=fat
echo.
echo f = [%f%]
echo.
echo str = [%str%]
set str=!str:%f%=thin!
echo str:f=thin = [%str%]
Надеюсь, вы убедились!
- Но это не работает, когда ваш код находится внутри цикла FOR / F. % f% - ничего не ...
Ответ #2
Ответ на вопрос: Как заменить содержимое переменной в командном файле Windows
Используйте ЗВОНОК. Поместите следующее в пакетный 9X_windows-batch сценарий и запустите его:
set a=The fat cat
set b=fat
set c=thin
REM To replace "%b%" with "%c%" in "%a%", we can do:
call set a=%%a:%b%^=%c%%%
echo %a%
pause
Как указано here, мы 9X_windows-batch используем тот факт, что:
ВЫЗОВ internal_cmd
...
internal_cmd Запустите 9X_cmd.exe внутреннюю команду, сначала раскрывая все переменные в аргументе.
В нашем случае internal_cmd изначально 9X_dos-batch set a = %% a:% b% ^ =% c %%%.
После расширения internal_cmd становится set a =% a: fat = thin%.
Таким образом, в нашем случае 9X_batch работает
набор вызовов a = %% a:% b% ^ =% c %%%
эквивалент бегу:
set a =% a: fat = thin%.
Ответ #3
Ответ на вопрос: Как заменить содержимое переменной в командном файле Windows
Проблема с:
echo %a:%c%=thin%
заключается в том, что он пытается 9X_windows-programming раскрыть две переменные: a:
и =thin
с помощью постоянной 9X_windows-programming строки c
между ними.
Попробуйте это:
echo echo ^%a:%c%=thin^% | cmd
Первая 9X_windows-application команда выводит:
echo %a:fat=thin%
, который передается во 9X_windows-application вторую командную оболочку для оценки.
- Я ожидал такого поведения, но я также ожидал бы некоторого способа отложить расширение или «вложить» расширение. Кстати, я согла ...
Ответ #4
Ответ на вопрос: Как заменить содержимое переменной в командном файле Windows
И ... Как насчет этого?
@echo off
setlocal enabledelayedexpansion
set str=The fat cat
set f=fat
set t=thin
echo.
echo f = [%f%]
echo t = [%t%]
echo.
echo str = [%str%]
set str=!str:%f%=%t%!
echo str:f=t = [%str%]
Отлично, а?
9X_windows-programming
Ответ #5
Ответ на вопрос: Как заменить содержимое переменной в командном файле Windows
Я стараюсь избегать использования SETLOCAL enabledelayedexpansion ... ENDLOCAL
все (или 9X_bat почти все) время, потому что обычно я хочу 9X_cmd.exe установить или изменить несколько переменных 9X_windows и хочу, чтобы новые значения были доступны 9X_windows-programming в других областях скрипта или после пакета 9X_batch сценарий завершается (SETLOCAL | ENDLOCAL 9X_windows забудет о любых новых переменных или изменениях 9X_windows переменных в части сценария "SETLOCAL". Иногда 9X_.bat это удобно, но для меня это обычно не так.
В 9X_cmd настоящее время я использую метод, описанный 9X_windows-programming @Zuzel, но, прежде чем я узнал об этом методе, я 9X_dos-batch использовал его, который очень похож (но 9X_windows выглядит немного сложнее):
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
результат 9X_batch-script выполнения сценария:
before: "The fat cat"
replace "fat" with "thin" in "The fat cat" using for:
after for: "The thin cat"
Мне нравится этот метод, потому 9X_cmd.exe что вы можете вызывать внешние программы 9X_cmd (или внутренние команды) с использованием 9X_batch-script измененных переменных, а также захватывать 9X_batch-files и обрабатывать вывод команды (построчно).
Но 9X_batch метод Зузеля проще и понятнее для большинства 9X_cmd.exe ситуаций, включая описанную вами.
Примечание.
Оба этих 9X_.bat метода (и, конечно же, SETLOCAL enabledelayedexpansion ... ENDLOCAL
) работают правильно 9X_windows-batch только при запуске из пакетного сценария. Если 9X_windows-programming вы попытаетесь использовать любой из этих 9X_cmd двух методов («call» или «for») непосредственно 9X_cmd.exe в окне командной строки, вы получите нечто 9X_batch отличное от того, что выводилось из сценария.
Например, запустите 9X_windows это как скрипт:
@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")
Теперь 9X_bat запустите эти команды прямо в окне командной 9X_windows-programming строки:
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:\>
проверьте строки вывода до и после 9X_.bat в окне командной строки:
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")
Обратите внимание, что 9X_windows замены сделаны правильно, но также обратите 9X_bat внимание, что при запуске этих команд непосредственно 9X_windows-applications в окне командной строки он добавляет набор 9X_cmd.exe "%" (знаков процента) до и после ожидаемого 9X_windows-application значения каждый раз, когда выполняется замена. . Таким 9X_.bat образом, это затрудняет тестирование любого 9X_windows-batch из этих методов непосредственно в окне командной 9X_dos-batch строки.
Ответ #6
Ответ на вопрос: Как заменить содержимое переменной в командном файле Windows
Недавно я столкнулся с такой же ситуацией 9X_batch ... Как уже говорилось ранее, я использовал, как 9X_batch-script показано ниже, и работал ...
set filearg=C:\data\dev\log\process
set env=C:\data\dev
REM I wanted \log\process as output
SETLOCAL enabledelayedexpansion
set str2=!filearg:%env%=!
echo Output : %str2%
echo.
endlocal
Вывод:
\log\process
Сработало 9X_batch-script .. !!
-
24
-
7
-
15
-
5
-
17
-
16
-
10
-
10
-
5
-
7
-
24
-
6
-
8
-
8
-
8
-
13
-
5
-
10
-
6
-
12
-
29
-
8
-
2
-
6
-
14
-
5
-
10
-
10
-
8
-
6
-
6
-
7
-
3
-
6
-
12
-
3
-
7
-
13
-
10
-
8
-
5
-
3
-
2
-
4
-
7
-
5
-
20
-
5
-
10
-
6