批處理之讀寫ini配置文件

1. 簡介

批處理並沒有直接讀寫ini文件的功能。所以只能通過讀取文件內容分析比較來找到相應段名、鍵名對應位置,然後提取相應字符串來做爲讀。寫則是找到鍵名對應的內容,然後進行替換,重新新的文件然後覆蓋原文件。

2. 讀取

2.1. 前期處理

要求輸出的參數有配置文件路徑、段名、鍵名。並且這3個字符串都需要進行Trim處理,即消除字符串前後可能存在的空格,提升代碼的兼容性與可靠性。
代碼中用了3個代碼標籤希,提供Trim功能,其中利用到遞歸達到去除所有的空格。

2.2. 代碼

@echo off

call :Begin "%~1" "%~2" "%~3" 

:TrimLeft
set "var=%~1"
if "%var:~0,1%"==" " call :TrimLeft "%var:~1%" 
goto :eof

:TrimRight
set "var=%~1"
if "%var:~-1%"==" " call :TrimRight "%var:~0,-1%"
goto :eof

:Trim
call :TrimLeft "%%~1%"
call :TrimRight "%var%"
goto :eof

:Begin
set "filePath=%~1"
call :Trim "%filePath%"
set "filePath=%var%"
set "section=%~2"
call :Trim "%section%"
set "section=[%var%]"
set "Key=%~3"
call :Trim "%Key%"
set "Key=%var%"


rem find是獲取包括指定字符串的行號[linenumber]
rem usebackq表示in中的路徑可能包含空格,delims=[]提取find找到的行號
for /f "usebackq delims=[]" %%i in (`find /i "%section%" /n %filepath%`) do set sectionName=%%i
 
setlocal EnableDelayedExpansion
rem token表示分配的字符串取前2個,按%%i自加,delims==表示以=分隔,skip表示跳過指定行數
for /f "usebackq tokens=1,2 delims== skip=%sectionName%" %%i in (`type %filepath%`) do (
		set "KeyDst=%%i"
		call :Trim "!KeyDst!"
		set "KeyDst=!var!"
				
		set "Value=%%j"
		call :Trim "!Value!"
		set "Value=!var!"
		
		rem 找到下一個section[時退出
		set "a=%%i"
        if "!a:~0,1!"=="[" goto :eof
				
		if "!KeyDst!"=="%Key%" (
			echo key:%%i
			echo value:!Value!
			goto :eof
			)
        )
)
goto :eof

3. 修改

3.1. 前期處理

依然是要處理參數的空格問題。另外就是先找段名,再找到鍵名,再直接替換原有的內容,並生成到臨時文件中。操作完之後,將臨時文件替換原文件,並刪除臨時文件。有一點遺憾的是分號自動消除了,無法註釋。

3.2. 代碼

@echo off >temp.ini

call :Begin "%~1" "%~2" "%~3" "%~4"

:TrimLeft
set "var=%~1"
if "%var:~0,1%"==" " call :TrimLeft "%var:~1%" 
goto :eof

:TrimRight
set "var=%~1"
if "%var:~-1%"==" " call :TrimRight "%var:~0,-1%"
goto :eof

:Trim
call :TrimLeft "%%~1%"
call :TrimRight "%var%"
goto :eof

:Begin
set "filePath=%~1"
call :Trim "%filePath%"
set "filePath=%var%"
set "section=%~2"
call :Trim "%section%"
set "section=[%var%]"
set "Key=%~3"
call :Trim "%Key%"
set "Key=%var%"
set "Val=%~4"
call :Trim "%Val%"
set "Val=%var%"


@echo off >tmp.ini

setlocal EnableDelayedExpansion
set /a flag=0
rem token表示分配的字符串取前2個,按%%i自加,delims==表示以=分隔,skip表示跳過指定行數
for /f "usebackq tokens=1* delims== " %%i in (`type %filepath%`) do (
		set "KeyDst=%%i"
		call :Trim "!KeyDst!"
		set "KeyDst=!var!"
		if "!var:~0,1!"=="[" (
		echo.>>tmp.ini
		echo %%i>>tmp.ini
		echo %%i|find "%section%">nul&&set /a flag=1) else (
		if !flag!==1 (
			if "!KeyDst!"=="%Key%" ( 
			echo %key%=%Val%>>tmp.ini
			set /a flag=0
			) else (
				if %%j=="" (
				echo %%i>>tmp.ini
				) else echo %%i=%%j>>tmp.ini
			)
		) else (
			if defined %%j (
			echo %%i>>tmp.ini
			) else echo %%i=%%j>>tmp.ini
		))
)
copy tmp.ini %filepath% /y >nul||(attrib -s -a -r -h %filepath%& copy tmp.ini %filepath% /y >nul)
del tmp.ini

echo finish
goto :eof

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章