搜索和替换批处理文件的问题

时间:2010-12-02 10:11:23

标签: batch-file

我有一个XML文件,我有一个批处理文件来搜索该文件中的特定字符串,将其替换为用户定义的字符串,然后将其输出到新的XML文件:

@echo off > entities_1.xml
setLocal EnableDelayedExpansion

if exist entities_1.xml del entities_1.xml
set /p name= What is the new space NAME?

for /f "tokens=* delims= " %%G in (entities.xml) do (
set str=%%G
set str=!str:[Test Space]=[%name%]!
echo !str! >> entities_1.xml
)

这样可以使用[Test Space]的任何实例替换为用户定义的值。

然而,我的问题是批处理文件还剥离了感叹号(!)标记的实例。因此,例如在XML中有类似的行:

<property name="title"><![CDATA[TEST2]]></property>

当批处理脚本运行时,它正在用以下代码替换:

<property name="title"><[CDATA[TEST2]]></property>

即。剥掉了!。

我哪里错了?有什么想法吗?

3 个答案:

答案 0 :(得分:5)

在启用延迟扩展时,通过设置str = %% G 接收线路是错误的。
这是因为延迟扩展阶段是在%% v扩展阶段之后。

对于已禁用的延迟扩展,您遇到了问题,您无法以安全的方式替换字符串。 所以你必须切换延迟扩展。

@echo off > entities_1.xml
setLocal DisableDelayedExpansion

if exist entities_1.xml del entities_1.xml
set /p name= What is the new space NAME?

for /f "tokens=* delims= " %%G in (entities.xml) do (
    set str=%%G
    setLocal EnableDelayedExpansion
    set str=!str:[Test Space]=[%name%]!
    >> entities_1.xml echo(!str!
    endlocal
)

切换重定向,因此您不会始终追加空格 使用 echo(,如果!str!为空,则不会回显

答案 1 :(得分:2)

您需要创建空文件entities_1.xml,因为由于某些不明原因,>>不会使用cmd作为shell创建它。
因此,在TYPE NUL > entities_1.xml循环之前使用FOR来创建一个零字节长文件。

答案 2 :(得分:0)

查看我关于完全相同主题的回答问题,它得到了很好的回答。

how to replace a string on the second line in a text file using a batch file?

希望这有帮助!