搜索和替换批处理文件的问题
搜索和替换批处理文件的问题
我有一个XML文件,并且我有一个批处理文件用于在该文件中搜索特定字符串,将其替换为用户定义的字符串,然后将其输出到一个新的XML文件中:
@echo off > entities_1.xml setLocal EnableDelayedExpansion if exist entities_1.xml del entities_1.xml set /p name= 新空间名称是什么? for /f "tokens=* delims= " %%G in (entities.xml) do ( set str=%%G set str=!str:[测试空间]=[%name%]! echo !str! >> entities_1.xml )
这个方法有效,[测试空间]的任何实例都会被用户定义的值替换掉。
然而,我的问题是批处理文件也会删除叹号(!)标记的实例。例如,在XML中有类似于以下的行:
当运行批处理脚本时,它会将上述行替换为:
<[CDATA[TEST2]]>
即删除了叹号(!)。
我在哪里出错了?有什么想法吗?
问题:搜索和替换批处理文件出现的问题
原因:在启用延迟扩展的情况下,通过set str=%%G的方式接收一行是错误的。这是因为延迟扩展阶段在%%v扩展阶段之后。禁用延迟扩展会导致在安全方式下无法替换字符串。
解决方法:
1. 切换延迟扩展:
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 )
2. 切换重定向,以避免始终添加空格。
3. 使用echo(,这样如果!str!为空,就不会显示echo is on。