之前對批處理和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謝謝