【问题标题】:Problem with search and replace batch file搜索和替换批处理文件的问题
【发布时间】:2010-12-02 10:11:23
【问题描述】:

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

即去掉!。

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

【问题讨论】:

标签: batch-file


【解决方案1】:

启用延迟扩展时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
)

切换重定向,因此您不必总是附加空格。
使用 echo(,因此如果 !str! 为空,则不会 echo is on。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 也很有用。谢谢伯努瓦。
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2012-03-21
    • 2023-03-10
    • 2014-09-24
    • 2018-02-21
    相关资源
    最近更新 更多