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

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!%%

以上是关于批处理文件中的字符串替换的主要内容,如果未能解决你的问题,请参考以下文章

bat SET中替换字符串(用变量代表需替换的字符串)

通过 Windows 批处理文件将字符串替换为文本文件中的 unicode

如何使用批处理文件中的变量查找和替换 %PATH% 系统变量中的字符串?

bat命令怎么替换里面的字符串?

在 FOR 循环批处理语法中使用变量进行字符串替换

替换从字符开始并以另一个字符结束的文本文件中的子字符串