Как заменить содержимое переменной в командном файле 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 не имеет значения.

17
0
6
Общее количество ответов: 6

Ответ #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%]

Надеюсь, вы убедились!

15
1

  • Но это не работает, когда ваш код находится внутри цикла 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%.

11
0

Ответ #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 вторую командную оболочку для оценки.

2
1

  • Я ожидал такого поведения, но я также ожидал бы некоторого способа отложить расширение или «вложить» расширение. Кстати, я согла ...

Ответ #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

2
0

Ответ #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 строки.

2
0

Ответ #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 .. !!

1
0