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
                    1. 简介批处理并没有直接读写ini文件的功能。所以只能通过读取文件内容分析比较来找到相应段名、键名对应位置,然后提取相应字符串来做为读。写则是找到键名对应的内容,然后进行替换,重新新的文件然后覆盖原文件。2. 读取2.1. 前期处理要求输出的参数有配置文件路径、段名、键名。并且这3个字符串都需要进行Trim处理,即消除字符串前后可能存在的空格,提升代码的兼容性与可靠性。代码中用了3个代...
::      inifile c:\boot.ini                                     
::      读取c:\boot.ini的所有[section]                        
::      inifile c:\boot.ini "[boot loader]"                     
::      读取c:\boot.ini [boot loader]段的内容                  
::      inifile c:\boot.ini "[boot loader]" timeout             
::      显示c:\boot.ini [boot loader]段 timeout的值            
 set /p Server_IP_FTP=请输入FTP服务器IP(帮助:/h):
 set Server_IP_FTP=%Server_IP_FTP%
 if /i "%Server_IP_FTP%"=="/h" cls & echo FTP服务器格式:1.2.3.4 & goto set_IP
 if "%Server_IP_FTP%"=="" cls & echo 请重新输入 & goto set_IP
				
windows bat 读取 ini 配置文件 参考链接:https://stackoverflow.com/questions/2866117/windows-batch-script-to-read-an-ini-file 这个 bat 支持 ini 的键值与=号之间存在空格,例如 key1 = value1 readini.bat @if (@a==@b) @end /* -- batch / JScript hybrid line to begin JScript comment :: -----
echo config:%CONFIG_FILE_PARAM% for /f "usebackq skip=1 tokens=1,2 delims==" %%a in (%CONFIG_FILE_PARAM%) do ( @rem if %2==%%a set %3=%%b& @echo ReadConfig: %%a=%%b @echo off >tmp.ini<br /> set IniFn=<br /> ::在等号后面写上ini的文件名,如:set IniFn=configip.ini<br /> for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" c:/Windows/%IniFn%') do (<br />       if "%%j"=="" (echo.>>tmp.ini) else (<br /> 1.linux下INI配置文件读写操作库 ======================================================================== if(false) SET(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER "/home/swapp/arm/5.4.0/bin/arm-linux-gcc") set(CMAKE_CXX_COMPILER "/home/swapp/arm/5.4.0/bin/arm-linux-g++") else() SET(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER "/usr/bin/gcc") set(CMAKE_CXX_COMPILER "/usr/bin/g++") endif() ======================================================================== 编译linux: 修改CMakeLists.txt里上面代码,使用/usr/bin/gcc编译 1. mkdir linux_build 2. cd linux_build 3. cmake .. 4. make 编译arm: 修改CMakeLists.txt里上面代码,使用arm-linux-gcc编译,这里选择您arm编译器的绝对路径 1. mkdir arm_build 2. cd arm_build 3. cmake .. 4. make
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。
批处理是Windows自带的一个脚本引擎,语法简洁、内置一些功能强大的命令,并且可以与Windows上的其他软件进行良好的通信。批处理能够提供一系统自动化处理功能,大幅提高日常工作中的一些琐碎重复事情的效率。 1. 概念 批处理(Batch),顾名思义即是指批量处理。批处理是基于dos命令行,Windows默认内置解释器cmd.exe的脚本语言。批处理文件默认保存为.bat或.cmd。 批处理是基于Dos命令行,所以批处理是没有GUI的,是运行在命令提示符终端(Command Prompt Termina
set KEY=key_name for /f "tokens=2 delims==" %%a in ('type "%INI_FILE%" ^| findstr /i /c:"[%SECTION%]" /c:"%KEY%"') do ( set VALUE=%%a echo %VALUE% 其中,您需要将 `path\to\your\ini\file.ini` 替换为您的INI文件的路径,`section_name` 替换为您要获取的节的名称,`key_name` 替换为您要获取的键的名称。 此命令将读取INI文件中指定节和键的值,并将其存储在 `VALUE` 变量中。最后,它将输出 `VALUE` 变量的值。