首页 > 代码库 > DOS 批处理 修改xml文件

DOS 批处理 修改xml文件

之前对批处理和dos只停留在cd ping ipconfig水平,我以为改个文件应该很简单吧,把文件读出来做个替换再写回去不就欧了,百度个例子改改,那还不是分分钟的事,哪知道事实比想的要复杂的多。

我要修改的是这样一个文件内容:

 ....

 mylove=“******”

 ....

mylove=“******”单独占一行,我只需修改*号部分。

首先我想用set命令把一个文件内容赋值给一个变量,各种尝试最后放弃了,本来以为set命令的a开关可以实现,哪知道这货只支持运算符,强烈建议a开关支持表达式,类似 set /a xml= "type test.xml"

网上看大家的代码,对文件操作大多用for命令,按行读取赋值给变量,如下:

setlocal enabledelayedexpansion

set xml=""

for /f "delims=" %%a in (‘type "mylove.xml"‘)

do ( set xml=!xml!%%a )

这样确实可以。

注:要想修改一个声明的变量时需要启动延时命令setlocal enabledelayedexpansion,使用时的‘%‘变成‘!’

再用set 被替换xml:替换xml替换下,再写回到文件,问题是我写的文件中包含 ‘!’字符,由于启用了延时命令,echo !xml! > new.xml的时候会出问题,无奈只能把延时命令善了。

最后用了笨方法,每读一行写一行到临时文件,如果读到我要修改的那行,就把新的行写进去。

期间遇到的问题有:

1.对空行(可能包含空格或tab也可能不包含)echo >new.xml 输出的内容是 echo处于啥啥状态,本来想用set :替换,怎么都替换不干净,最后还是笨方法,先输出一个到一个临时文件temp1.xml,再重读temp1.xml,过滤 echo...,输出空行命令:@echo. >new.xml

2.输出文件会有乱码,原因是文件本来是utf-8编码的,输出的时候用的gbk。修改方法是输出前执行:chcp 65001

如果你要修改的xml文件中不包含!,空行,不包含汉字或者是gbk编码的话,要好处理很多。

代码是笨了点好歹是实现了想要的结果,在这分享一点代码希望能帮助需要的人。

需要修改的文件mylove.xml内容:

...

<!-- 曾经的曾经 -->

mylove="于红"

...

批处理代码:

set newline=mylove="李畅"

for /f "delims=" %%a in (‘findstr "mylove=" mylove.xml‘)do (

for /f "delims=" %%i in (‘type "mylove.xml"‘) do (

if %%i==%%a (echo %newline%>>newlove.xml)else echo %%i>>newlove.xml ) ) pause

在这要感谢网络中各位战友的回答和提问,以上如有错误和不合理的地方望指正。O(∩_∩)O谢谢