批处理文件中的字符串替换
Posted
技术标签:
【中文标题】批处理文件中的字符串替换【英文标题】:String replacement in batch file 【发布时间】:2011-02-15 21:05:33 【问题描述】:我们可以使用以下命令替换批处理文件中的字符串
set str="jump over the chair"
set str=%str:chair=table%
这些行运行良好,并将字符串“jump over the chair”更改为“jump over the table”。现在我想用一些变量替换字符串中的单词“chair”,我不知道该怎么做。
set word=table
set str="jump over the chair"
??
有什么想法吗?
【问题讨论】:
how to replace string inside a bat file with command line parameter string 的可能副本,它有更多非正式的答案(虽然它与这里的答案有相同的解决方案) 现在谁是第一个并不重要,但最好将相同的问题联系起来并指出最不可破解的答案 【参考方案1】:我能够使用 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.
【讨论】:
【参考方案2】:这很好用
@echo off
set word=table
set str=jump over the chair
set rpl=%str:chair=%%word%
echo %rpl%
【讨论】:
对不起,看起来不错,但是错了!它会删除单词chair
并附加单词table
,但不会交换这两个单词。尝试用under
替换单词over
,你会得到jump the chairunder
【参考方案3】:
您可以使用以下小技巧:
set word=table
set str="jump over the chair"
call set str=%%str:chair=%word%%%
echo %str%
那里的call
引起了另一层变量扩展,因此必须引用原始的%
符号,但最终一切都解决了。
【讨论】:
我喜欢这个解决方案,在批处理文件中转义字符串总是有问题,ENABLEDELAYEDEXPANSION 只是增加了另一个需要担心的字符。 关于 Joey 提供的答案的重要事项。您需要将代码放入批处理文件才能使其工作。如果你只是在命令行中测试它,它会返回意外的%"jump over the "word%%%
。请注意,批处理文件和命令行中的代码可能会产生不同的结果。
基于 dadhi 的现场评论,命令行的解决方案在这里:***.com/questions/29944902/…。
赞成这个答案,因为它可以双向工作,环境变量在任一位置,或在“之前”和“之后”位置: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%'
【参考方案4】:
您可以使用 !,但您必须设置 ENABLEDELAYEDEXPANSION 开关。
setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%
【讨论】:
但是如果str
本身来自延迟扩展呢? set str=!str:chair=!word!!
无法正常工作。
我收到"jump over the !word!"
。
@ImaginaryHuman072889 我可以结合使用这个和下面的答案,即call set str=%%str:chair=!word!%%
以上是关于批处理文件中的字符串替换的主要内容,如果未能解决你的问题,请参考以下文章
通过 Windows 批处理文件将字符串替换为文本文件中的 unicode