Sostituzione della stringa nel file batch


102

Possiamo sostituire le stringhe in un file batch utilizzando il seguente comando

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

Queste linee funzionano bene e cambiano la stringa "salta sopra la sedia" in "salta sopra il tavolo". Ora voglio sostituire la parola "sedia" nella stringa con una variabile e non so come farlo.

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

Qualche idea?


possibile duplicato di come sostituire la stringa all'interno di un file bat con la stringa del parametro della riga di comando che ha una risposta molto più informale (ha le stesse soluzioni delle risposte qui però)
Fr0sT

1
ora non è importante chi sia stato il primo, ma è bene collegare domande identiche e indicare la risposta più irrefragabile
Fr0sT

Risposte:


79

È possibile utilizzare!, Ma è necessario che l'interruttore ENABLEDELAYEDEXPANSION sia impostato.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%

4
Ma cosa succede se strstesso proviene da un'espansione ritardata? set str=!str:chair=!word!!non funziona correttamente.
ImaginaryHuman072889

Capisco "jump over the !word!".
bers

88

Puoi usare il seguente piccolo trucco:

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

Il callci provoca un altro strato di espansione variabile, rendendo necessario citare l'originale %segni, ma funziona tutto alla fine.


Mi piace questa soluzione, l'escape delle stringhe è sempre problematico nei file batch, ENABLEDELAYEDEXPANSION aggiunge solo un altro carattere di cui preoccuparsi.
Anders

9
Cosa importante per quanto riguarda la risposta fornita da Joey . Che è necessario inserire il codice in un file batch affinché funzioni. Se lo provi solo nella riga di comando, tornerà inaspettato %"jump over the "word%%%. Tieni presente che il codice nei file batch e nella riga di comando può produrre risultati diversi.
dadhi

2
Basandosi sul commento spot-on di dadhi, la soluzione per la riga di comando è qui: stackoverflow.com/questions/29944902/… .
Kenn Sebesta

2
Upvoting questa risposta perché funziona in entrambi i modi, con la variabile d'ambiente in entrambe le posizioni, o in entrambe le posizioni "prima" e "dopo": 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

Sono stato in grado di utilizzare la risposta di Joey per creare una funzione:

Usalo come:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

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

GOTO:EOF

E queste funzioni in fondo al tuo file batch.

: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

E ricorda che DEVI aggiungere "SETLOCAL ENABLEDELAYEDEXPANSION" all'inizio del tuo file batch altrimenti niente di tutto questo funzionerà correttamente.

SETLOCAL ENABLEDELAYEDEXPANSION
@REM # Remember to add this to the top of your batch file.

-4

Funziona bene

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%

5
Mi dispiace, sembra buono, MA è sbagliato! Rimuove la parola chaire aggiunge la parola table, ma non scambia le due parole. Prova a sostituire la parola overcon undere ottienijump the chairunder
jeb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.