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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.