String-Ersetzung in Batch-Datei

102

Wir können Zeichenfolgen in einer Batchdatei mit dem folgenden Befehl ersetzen

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

Diese Zeilen funktionieren einwandfrei und ändern die Zeichenfolge "Über den Stuhl springen" in "Über den Tisch springen". Jetzt möchte ich das Wort "Stuhl" in der Zeichenfolge durch eine Variable ersetzen und weiß nicht, wie es geht.

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

Irgendwelche Ideen?

Faisal
quelle
Mögliches Duplikat, wie ein String in einer Bat-Datei durch einen Befehlszeilenparameter ersetzt wird, der eine viel informellere Antwort hat (es gibt jedoch die gleichen Lösungen wie die Antworten hier)
Fr0sT
1
Jetzt ist es nicht wichtig, wer der Erste war, aber es ist gut, identische Fragen zu verknüpfen und auf die unwiderlegbarste Antwort zu
verweisen

Antworten:

79

Sie können! Verwenden, aber Sie müssen den Schalter ENABLEDELAYEDEXPANSION eingestellt haben.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%
Vicky
quelle
4
Aber was ist, wenn es strsich um eine verzögerte Expansion handelt? set str=!str:chair=!word!!funktioniert nicht richtig.
ImaginaryHuman072889
Ich verstehe "jump over the !word!".
Bers
88

Sie können den folgenden kleinen Trick verwenden:

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

Das calldort bewirkt eine weitere Schicht variabler Expansion, was es notwendig macht, die ursprünglichen %Zeichen zu zitieren , aber am Ende klappt alles.

Joey
quelle
Ich mag diese Lösung, das Entkommen von Zeichenfolgen ist in Batch-Dateien immer problematisch. ENABLEDELAYEDEXPANSION fügt nur ein weiteres Zeichen hinzu, über das Sie sich Sorgen machen müssen.
Anders
9
Wichtige Sache bezüglich der Antwort von Joey . Dass Sie den Code in eine Batch-Datei einfügen müssen, damit er funktioniert. Wenn Sie es nur in der Befehlszeile testen, wird es unerwartet zurückgegeben %"jump over the "word%%%. Beachten Sie jedoch, dass Code in Batchdateien und in der Befehlszeile zu unterschiedlichen Ergebnissen führen kann.
Dadhi
2
Aufbauend auf Dadhis genauem Kommentar ist die Lösung für die Befehlszeile hier: stackoverflow.com/questions/29944902/… .
Kenn Sebesta
2
Upvoting dieser Antwort, weil es in beide Richtungen funktioniert, mit der Umgebungsvariablen in jeder Position oder in den Positionen "vor" und "nach": 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

Ich konnte Joeys Antwort verwenden, um eine Funktion zu erstellen:

Verwenden Sie es als:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

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

GOTO:EOF

Und diese Funktionen am Ende Ihrer Batch-Datei.

: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

Und denken Sie daran, dass Sie "SETLOCAL ENABLEDELAYEDEXPANSION" oben in Ihre Batch-Datei einfügen MÜSSEN, sonst funktioniert nichts davon ordnungsgemäß.

SETLOCAL ENABLEDELAYEDEXPANSION
@REM # Remember to add this to the top of your batch file.
Rachel Nichols
quelle
-4

Das funktioniert gut

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%
Sérgio Maurício Trad
quelle
5
Sorry, es sieht gut aus, ABER es ist falsch! Es entfernt das Wort chairund tablefügt es hinzu, aber es tauscht die beiden Wörter nicht aus. Versuchen Sie, das Wort overdurch zu ersetzen, underund Sie erhaltenjump the chairunder
jeb