Remplacement de chaîne dans le fichier de commandes

102

Nous pouvons remplacer des chaînes dans un fichier batch en utilisant la commande suivante

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

Ces lignes fonctionnent bien et changent la chaîne "sauter par-dessus la chaise" pour "sauter par-dessus la table". Maintenant, je veux remplacer le mot «chaise» dans la chaîne par une variable et je ne sais pas comment faire.

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

Des idées?

Faisal
la source
duplication possible de la façon de remplacer la chaîne dans un fichier chauve-souris par une chaîne de paramètres de ligne de commande qui a une réponse beaucoup plus informelle (elle a les mêmes solutions que les réponses ici)
Fr0sT
1
maintenant ce n'est pas important qui était le premier, mais il est bon de lier des questions identiques et de pointer vers la réponse la plus irréfragable
Fr0sT

Réponses:

79

Vous pouvez utiliser!, Mais vous devez avoir le commutateur ENABLEDELAYEDEXPANSION réglé.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%
Vicky
la source
4
Mais que se passe-t-il si strelle-même provient d'une expansion retardée? set str=!str:chair=!word!!ne fonctionne pas correctement.
ImaginaryHuman072889
Je reçois "jump over the !word!".
bers
88

Vous pouvez utiliser la petite astuce suivante:

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

L' callil provoque une autre couche d'expansion variables, ce qui rend nécessaire de citer les originaux des %signes , mais tout fonctionne à la fin.

Joey
la source
J'aime cette solution, échapper des chaînes est toujours problématique dans les fichiers batch, ENABLEDELAYEDEXPANSION ajoute simplement un autre caractère à s'inquiéter.
Anders
9
Chose importante concernant la réponse fournie par Joey . Que vous devez mettre le code dans un fichier de commandes pour que cela fonctionne. Si vous le testez simplement en ligne de commande, il retournera de manière inattendue %"jump over the "word%%%. Sachez simplement que le code dans les fichiers batch et en ligne de commande peut produire des résultats différents.
dadhi
2
S'appuyant sur le commentaire direct de dadhi, la solution pour la ligne de commande est ici: stackoverflow.com/questions/29944902/… .
Kenn Sebesta
2
Voter cette réponse parce qu'elle fonctionne dans les deux sens, avec la variable d'environnement dans l'une ou l'autre position, ou dans les deux positions «avant» et «après»: 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

J'ai pu utiliser la réponse de Joey pour créer une fonction:

Utilisez-le comme:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

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

GOTO:EOF

Et ces fonctions au bas de votre fichier 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

Et rappelez-vous que vous DEVEZ ajouter "SETLOCAL ENABLEDELAYEDEXPANSION" en haut de votre fichier batch, sinon rien de tout cela ne fonctionnera correctement.

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

Cela fonctionne bien

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%
Sérgio Maurício Trad
la source
5
Désolé, ça a l'air bien, MAIS c'est faux! Il supprime le mot chairet ajoute le mot table, mais il n'échange pas les deux mots. Essayez de remplacer le mot overpar underet vous obtenezjump the chairunder
jeb