2010-12-02 53 views
2

我有一个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 
) 

这可以工作,[测试空间]的任何实例都将被用户定义的值替换。

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

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

当运行批处理脚本,它与替换上面:

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

即剥离!

我哪里错了?有任何想法吗?

+0

可能重复的[查找字符串并替换批处理文件中的特定字母](http://stackoverflow.com/questions/17085650/find-a-string-and-replace-specific-letters-in-batch-file ) – 2014-12-26 10:00:54

回答

5

接收一条线的方法错误set 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 
) 

切换重定向,所以你没有总是追加一个空格。
使用回声(,所以你得到不回声是如果!STR!是空的。

+0

非常感谢杰布,这是完美的作品。天才要比!!! – JamesH 2010-12-08 14:55:54

2

您需要创建空文件entities_1.xml,因为对于一些模糊的原因>>不会创建cmd作为外壳。
所以在你的FOR循环之前使用TYPE NUL > entities_1.xml来创建一个零字节的长文件。

+0

也很有用。谢谢你Benoit。 – JamesH 2010-12-08 14:56:18