Замена строки в пакетном файле

103

Мы можем заменить строки в пакетном файле, используя следующую команду

set str="jump over the chair"
set str=%str:chair=table%

Эти линии работают нормально и меняют строку «перепрыгнуть через стул» на «перепрыгнуть через стол». Теперь я хочу заменить слово «стул» в строке некоторой переменной и не знаю, как это сделать.

set word=table
set str="jump over the chair"
??

Любые идеи?

Фейсал
источник
возможный дубликат того, как заменить строку внутри файла bat на строку параметра командной строки, которая имеет гораздо более неформальный ответ (хотя и имеет те же решения, что и ответы здесь)
Fr0sT
1
теперь не важно, кто был первым, но хорошо связать одинаковые вопросы и указать на самый исчерпывающий ответ
пт0ст

Ответы:

78

Вы можете использовать!, Но у вас должен быть установлен переключатель ENABLEDELAYEDEXPANSION.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%
Вики
источник
4
Но что, если он strвозник из-за отложенного расширения? set str=!str:chair=!word!!не работает правильно.
ImaginaryHuman072889
1
Я понимаю "jump over the !word!".
bers
89

Вы можете использовать следующий небольшой трюк:

set word=table
set str="jump over the chair"
call set str=%%str:chair=%word%%%
echo %str%

Это callвызывает еще один уровень расширения переменных, заставляя цитировать исходные %знаки, но в конце концов все работает.

Джоуи
источник
Мне нравится это решение, экранирование строк всегда проблематично в пакетных файлах, ENABLEDELAYEDEXPANSION просто добавляет еще один символ, о котором нужно беспокоиться.
Андерс
9
Важная вещь относительно ответа, предоставленного Джоуи . Что вам нужно поместить код в командный файл, чтобы он работал. Если вы просто протестируете его в командной строке, он вернется неожиданно %"jump over the "word%%%. Просто имейте в виду, что код в пакетных файлах и в командной строке может давать разные результаты.
dadhi
2
Основываясь на замечании Дадхи, решение для командной строки находится здесь: stackoverflow.com/questions/29944902/… .
Kenn Sebesta
3
Голосование за этот ответ, потому что он работает в обоих направлениях, с переменной окружения в любой позиции или в позициях «до» и «после»: set word=table set str="jump over the chair" call set str=%%str:chair=%word%%% echo %str% set word1=chair set word2=desk set str="jump over the chair" call set str=%%str:%word1%=%word2%%% echo %str%'
Том
0

Я смог использовать ответ Джои для создания функции:

Используйте это как:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET "MYTEXT=jump over the chair"
echo !MYTEXT!
call:ReplaceText "!MYTEXT!" chair table RESULT
echo !RESULT!

GOTO:EOF

И эти функции в нижней части вашего командного файла.

:FUNCTIONS
@REM FUNCTIONS AREA
GOTO:EOF
EXIT /B

:ReplaceText
::Replace Text In String
::USE:
:: CALL:ReplaceText "!OrginalText!" OldWordToReplace NewWordToUse  Result
::Example
::SET "MYTEXT=jump over the chair"
::  echo !MYTEXT!
::  call:ReplaceText "!MYTEXT!" chair table RESULT
::  echo !RESULT!
::
:: Remember to use the "! on the input text, but NOT on the Output text.
:: The Following is Wrong: "!MYTEXT!" !chair! !table! !RESULT!
:: ^^Because it has a ! around the chair table and RESULT
:: Remember to add quotes "" around the MYTEXT Variable when calling.
:: If you don't add quotes, it won't treat it as a single string
::
set "OrginalText=%~1"
set "OldWord=%~2"
set "NewWord=%~3"
call set OrginalText=%%OrginalText:!OldWord!=!NewWord!%%
SET %4=!OrginalText!
GOTO:EOF

И помните, что вы ДОЛЖНЫ добавить «SETLOCAL ENABLEDELAYEDEXPANSION» в начало вашего командного файла, иначе ничего из этого не будет работать должным образом.

SETLOCAL ENABLEDELAYEDEXPANSION
@REM # Remember to add this to the top of your batch file.
Рэйчел Николс
источник
-4

Это отлично работает

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%
Сержио Маурисио Трад
источник
5
Извините, выглядит хорошо, НО это неправильно! Он удаляет слово chairи добавляет слово table, но не меняет два слова. Попробуйте заменить слово overна, underи вы получитеjump the chairunder
jeb