Заміна рядків у пакетному файлі


102

Ми можемо замінити рядки в пакетному файлі за допомогою наступної команди

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

Ці рядки відмінно працюють і змінюють рядок «стрибати через стілець» на «стрибати через стіл». Тепер я хочу замінити слово "стілець" у рядку на якусь змінну, і я не знаю, як це зробити.

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

Якісь ідеї?


можливий дублікат того, як замінити рядок всередині файлу bat на рядок параметра командного рядка, який має набагато більше неофіційних відповідей (він має ті ж рішення, що і відповіді тут)
Fr0sT

1
зараз не важливо, хто був першим, але добре пов’язати однакові запитання та вказати на саму
непоправну

Відповіді:


79

Ви можете використовувати !, але у вас повинен бути встановлений перемикач 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

Я отримую "jump over the !word!".
бер

88

Ви можете скористатися такою маленькою хитрістю:

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

callТам викликає інший шар змінного розширення, що робить необхідним процитувати оригінальні %знаки , але все це працює, в кінці кінців.


Мені подобається це рішення, епіляція рядків завжди проблематична у пакетних файлах, ENABLEDELAYEDEXPANSION просто додає іншого символу, щоб турбуватися.
Андерс

9
Важлива річ щодо відповіді, наданої Джої . Що вам потрібно помістити код у пакетний файл, щоб він працював. Якщо ви просто перевірите його в командному рядку, він повернеться несподівано %"jump over the "word%%%. Зауважте, що код у пакетних файлах та командному рядку може давати різні результати.
таджі

2
Спираючись на спостережливий коментар тато, рішення для командного рядка знаходиться тут: stackoverflow.com/questions/29944902/… .
Кенн Себеста

2
Оновлення цієї відповіді, оскільки вона працює в обох напрямках, із зміною середовища в будь-якій позиції, або в обох положеннях "до" і "після": 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
Джеб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.