之前对批处理和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谢谢
DOS 批处理 修改xml文件