Zastępowanie ciągów w pliku wsadowym

103

Możemy zamienić ciągi znaków w pliku wsadowym za pomocą następującego polecenia

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

Te linie działają dobrze i zmieniają sznurek „przeskocz przez krzesło” na „przeskocz przez stół”. Teraz chcę zamienić słowo „krzesło” w ciągu na jakąś zmienną i nie wiem, jak to zrobić.

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

Jakieś pomysły?

Faisal
źródło
możliwy duplikat tego, jak zamienić ciąg w pliku bat na ciąg parametrów wiersza poleceń, który ma znacznie bardziej nieformalną odpowiedź (ma jednak te same rozwiązania, co odpowiedzi tutaj)
Fr0sT
1
teraz nie jest ważne, kto był pierwszy, ale dobrze jest połączyć identyczne pytania i wskazać najbardziej nieodpartą odpowiedź
Fr0sT

Odpowiedzi:

78

Możesz użyć!, Ale musisz mieć ustawiony przełącznik ENABLEDELAYEDEXPANSION.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%
Vicky
źródło
4
Ale co, jeśli strsam pochodzi z opóźnionej ekspansji? set str=!str:chair=!word!!nie działa poprawnie.
ImaginaryHuman072889
1
Rozumiem "jump over the !word!".
bers
89

Możesz użyć następującej małej sztuczki:

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

callNie powoduje kolejną warstwę zmiennej ekspansji, co konieczne, aby zacytować oryginalne %znaki, ale to wszystko działa w końcu.

Joey
źródło
Podoba mi się to rozwiązanie, ucieczka ciągów jest zawsze problematyczna w plikach wsadowych, ENABLEDELAYEDEXPANSION po prostu dodaje kolejny znak, o który należy się martwić.
Anders
9
Ważna rzecz dotycząca odpowiedzi udzielonej przez Joey'a . Że musisz umieścić kod w pliku wsadowym, aby działał. Jeśli po prostu przetestujesz go w linii poleceń, zwróci nieoczekiwany wynik %"jump over the "word%%%. Należy tylko pamiętać, że kod w plikach wsadowych iw wierszu poleceń może dawać różne wyniki.
dadhi
2
Opierając się na komentarzu dadhi, rozwiązanie dla wiersza poleceń jest tutaj: stackoverflow.com/questions/29944902/… .
Kenn Sebesta
3
Głosowanie za tą odpowiedzią, ponieważ działa w obie strony, ze zmienną środowiskową w dowolnej pozycji lub w obu pozycjach „przed” i „po”: 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%'
Tom Warfield
0

Udało mi się użyć odpowiedzi Joey'a do stworzenia funkcji:

Użyj go jako:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

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

GOTO:EOF

I te funkcje na dole pliku wsadowego.

: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

I pamiętaj, że MUSISZ dodać „SETLOCAL ENABLEDELAYEDEXPANSION” na początku pliku wsadowego, inaczej nic z tego nie będzie działać poprawnie.

SETLOCAL ENABLEDELAYEDEXPANSION
@REM # Remember to add this to the top of your batch file.
Rachel Nichols
źródło
-4

To działa dobrze

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%
Sérgio Maurício Trad
źródło
5
Przepraszamy, wygląda dobrze, ALE jest źle! Usuwa słowo chairi dodaje je table, ale nie zamienia dwóch słów. Spróbuj zamienić słowo overz underi maszjump the chairunder
Jeb