1. 程式人生 > >批處理替換xml檔案指定內容

批處理替換xml檔案指定內容

由於常常需要切換IP地址的配置檔案,多個檔案修改,其實最簡單的就是edittext++ 查詢替換

但是有的時候就是抽風,閒的蛋疼,想編寫一個windows批處理檔案進行修改,想想應該挺小菜的,網上應該容易找的到。。

萬萬沒想到。。。

記下來,萬一有誰和我一樣抽風...,提供個參考

@echo off & setlocal enabledelayedexpansion

echo ***請輸入需要操作的序號***
echo.
echo 1.替換152伺服器為...伺服器
echo.
echo 2.替換...伺服器為152伺服器
echo.
set /p num=請輸入操作選項:
chcp 65001
set dscfgdir=/檔案目錄
set apachedir=d:\檔案目錄
if %num%==1 (
cd /d %apachedir%
for /f "tokens=*" %%i in (context.xml) do (
	if "%%i"=="" (echo.) else (set "line=%%i" & call :chg)
)>>context.tmp
for /f "tokens=*" %%i in (server.xml) do (
	if "%%i"=="" (echo.) else (set "line=%%i" & call :chg)
)>>server.tmp
call :modify

cd %dscfgdir%
for /f "tokens=*" %%i in (dscfg.xml) do (
	if "%%i"=="" (echo.) else (set "line=%%i" & call :chg)
)>>dscfg.tmp
call :modifydsc
) else if %num% ==2 (
cd /d %apachedir%
for /f "tokens=*" %%i in (context.xml) do (
	if "%%i"=="" (echo.) else (set "line=%%i" & call :chg2)>>context.tmp
)
for /f "tokens=*" %%i in (server.xml) do (
	if "%%i"=="" (echo.) else (set "line=%%i" & call :chg2)>>server.tmp
)
call :modify
cd %dscfgdir%
for /f "tokens=*" %%i in (dscfg.xml) do (
	if "%%i"=="" (echo.) else (set "line=%%i" & call :chg2)
)>>dscfg.tmp
call :modifydsc
) else (echo 無效選項)
pause
exit

:chg
rem 進行替換操作
set "line=!line:需要替換的字元=替換的字元!"
echo !line!
goto :eof

:chg2
set "line=!line:需要替換的字元=替換的字元!"
echo !line!
goto :eof

:modify
if exist context.bak (del context.bak)
ren context.xml context.bak
ren context.tmp context.xml
if exist server.bak (del server.bak)
ren server.xml server.bak
ren server.tmp server.xml

:modifydsc
if exist dscfg.bak (del dscfg.bak)
ren dscfg.xml dscfg.bak
ren dscfg.tmp dscfg.xml

chcp65001是解決xml中中文字元的

你以為這就完了,,還有一個更坑的玩意兒,!與windows的延遲變數之間的。。。按照上邊輸出,!是輸不出的

需要在for迴圈中新增

for /f "tokens=*" %%i in (context.xml) do (
	if "%%i"=="" (echo.) else (
	setlocal disabledelayedexpansion
	set "line=%%i" & call :chg)
)>>context.tmp

for迴圈中都改真這個樣子,總共四個。。

:chg
rem 進行替換操作
setlocal enabledelayedexpansion
set "line=!line:10.2.0.152=10.8.2.35!"
echo !line!
goto :eof
chg ,chg2都改成這個樣子

這是臨時關閉、開啟延遲變數

提供一個最簡化的例子,一共方便檢視

@echo off & setlocal enabledelayedexpansion
chcp 65001

for /f "tokens=*" %%i in (context.txt) do (
	setlocal disabledelayedexpansion
	set line=%%i
	setlocal enabledelayedexpansion
	echo !line!	
)
pause