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