批处理文件中的字符串替换


102

我们可以使用以下命令替换批处理文件中的字符串

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

这些行工作正常,并将字符串“跳转到椅子上”更改为“跳转到桌子上”。现在,我想用一些变量替换字符串中的“椅子”一词,但我不知道该怎么做。

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

有任何想法吗?


可能如何使用命令行参数字符串替换bat文件中的字符串,该参数具有非正式的答案(尽管这里的答案与此处的答案相同)
Fr0sT 2015年

1
现在,谁在第一位并不重要,但是将相同的问题联系起来并指向最难以理解的答案是很好的
Fr0sT 2015年

Answers:


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只是增加了另一个需要担心的字符。
安德斯(Anders)2010年

9
关于Joey提供的答案的重要事情。您需要将代码放入批处理文件中才能工作。如果仅在命令行中对其进行测试,它将返回意外的%"jump over the "word%%%。请注意,批处理文件和命令行中的代码可能会产生不同的结果。
dadhi 2014年

2
基于dadhi的即时评论,命令行的解决方案在这里: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%'
Tom Warfield

0

我能够使用Joey's Answer来创建一个函数:

用作:

@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,但不交换两个单词。尝试更换字overunder和你jump the chairunder
杰布
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.