Board logo

标题: [分享] 批处理读取INI文件 [打印本页]

作者: chenall     时间: 2006-12-19 01:49    标题: [分享] 批处理读取INI文件
:::::::::INI文件读取 by chenall QQ:366840202:::::::::::::::::::::: ::使用方法: :: inifile iniFilePath [section] [item] ::例子: :: 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的值 :: ::::::::::::::::::::::::::::::::::::::::::::2006-12-18:::::::::::: 因自己的需要编写的一个批处理,大家可共同完善.
  1. @echo off
  2. :::::::::INI文件读取 by chenall QQ:366840202::::::::::::::::::::::
  3. ::使用方法: ::
  4. :: inifile iniFilePath [section] [item] ::
  5. ::例子: ::
  6. :: inifile c:\boot.ini ::
  7. :: 读取c:\boot.ini的所有[section] ::
  8. :: inifile c:\boot.ini "[boot loader]" ::
  9. :: 读取c:\boot.ini [boot loader]段的内容 ::
  10. :: inifile c:\boot.ini "[boot loader]" timeout ::
  11. :: 显示c:\boot.ini [boot loader]段 timeout的值 ::
  12. ::07-04-26 新增设置变量的功能,只需将下面的setvar=0改为1即可 ::
  13. ::09-11-05 重写并优化部份代码,修正不能正确设置变量的BUG ::
  14. :: 100:文件不存在或未找到 ::
  15. ::::::::::::::::::::::::::::::::::::::::::::2006-12-21::::::::::::
  16. SETLOCAL
  17. set setvar=1
  18. ::当有指定[item]参娄并且setvar值为1时就将[item]的值设为变量[item]
  19. ::例子inifile c:\boot.ini "[boot loader]" timeout 就可以得到一个%timeout%的变量
  20. ::初始化变量
  21. set exit_code=
  22. set item=
  23. set item_value=inifile=没有找到指定项目!
  24. set filepath=
  25. set section=
  26. set inifile=
  27. if not "%~1"=="" (
  28. set filepath=%1
  29. ) else goto :file_err
  30. if not exist %filepath% goto :file_err
  31. if "%~2"=="" goto :section
  32. set "section=%~2"
  33. set "item=%~3"
  34. call :开始
  35. endlocal&if defined item set %item_value%
  36. goto :eof
  37. :开始
  38. for /f "usebackq delims=[] skip=2" %%i in (`find /i "%section%" /n %filepath%`) do set 字段开始=%%i
  39. if "%字段开始%"=="" goto :eof
  40. for /f "eol=; usebackq tokens=1* skip=%字段开始% delims==" %%i in (`type %filepath%`) do (
  41. call :分析数据 "%%i" "%%j"
  42. ::强制退出,并返回一个退出代码
  43. if defined exit_code exit /b %exit_code%
  44. )
  45. goto :eof
  46. :分析数据
  47. set "a=%~1"
  48. setlocal EnableDelayedExpansion
  49. call :trim a
  50. endlocal & set "a=%a%"
  51. ::如果获取到的第一个字符是"[",说明本节已经搜索完成。退出,返回0
  52. if "%a:~0,1%"=="[" (set exit_code=0&goto :eof)
  53. ::分析数据,因为INI文件一般“;”以后是注释符,这里去掉注释。
  54. for /f "delims=;" %%x in ("%a%=%~2") do (
  55. if not DEFINED item (echo %%x) else (
  56. if /i "%a%"=="%item%" (
  57. set exit_code=0
  58. if "%setvar%"=="1" (
  59. set "item_value=%%x"
  60. ) else (
  61. echo %%x
  62. )
  63. )
  64. )
  65. )
  66. goto :eof
  67. :section
  68. for /f "eol=; usebackq delims== skip=2" %%i in (`find /i "[" %filepath%`) do echo %%i
  69. goto :eof
  70. :trim
  71. if "!%1:~0,1!"==" " (set %1=!%1:~1!&&goto trim)
  72. if "!%1:~0,1!"==" " (set %1=!%1:~1!&&goto trim)
  73. if "!%1:~-1!"==" " (set %1=!%1:~0,-1!&&goto trim)
  74. if "!%1:~-1!"==" " (set %1=!%1:~0,-1!&&goto trim)
  75. goto :eof
  76. :file_err
  77. echo.
  78. echo %1文件未找到或未输入!
  79. echo.
  80. exit /b 100
  81. goto :eof
chenall 发表于: 2009-11-06 19:17
[ Last edited by chenall on 2009-11-6 at 19:44 ]
附件 1: inifile.rar (2007-4-26 11:54, 1012 bytes, 下载附件所需积分 1点 ,下载次数: 237)

作者: namejm     时间: 2006-12-19 01:54
  建议 chenall 兄把附件里的内容以代码的形式张贴在顶楼,以方便大家直接就帖子内容进行讨论,也方便你对代码进行更新。

作者: HUNRYBECKY     时间: 2006-12-19 02:01
测试有问题,提示命令语法不正确.

作者: chenall     时间: 2006-12-19 02:02
呵呵,目前的处理方法感觉还不是很好,希望有人可以给出一个更好的方法.

作者: chenall     时间: 2006-12-19 02:03
Originally posted by HUNRYBECKY at 2006-12-19 02:01 AM: 测试有问题,提示命令语法不正确.
请贴出你使用的命令. 未加参数运行也会有这个提示.等下再改了 有可能是没有加"的原因. 建议加的参数都用"" 例子: inifile "c:\boot.ini" "[boot loader]" "timeout" 一楼的代码已经更新,附件未更新,可根据一楼的代码修改一下. if not exist %1 goto :file_err 移动到下一行改为 if not exist %filepath% goto :file_err [ Last edited by chenall on 2006-12-19 at 02:08 AM ]

作者: namejm     时间: 2006-12-19 02:11
  对 boot.ini 的格式和含义不甚了解,chenall 兄能否帖一个极度BT的示范例子出来,要求里面要出现尽可能多的特殊情况:比如特殊字符啦、比如空行啦、比如光标定位在某行的末尾而不是定位在最后一个空行上啦……只有把最BT的情形都考虑到了,做出来的代码才具备最大的兼容性。

作者: chenall     时间: 2006-12-19 02:16
对于像这种格式的 [xxxx] aaabbbddd ;aaaaaaaaa cccccccccc ;aaaaaaaaaa ;后面的内容是不读取的.因为;后是注释. 可以试试系统中的INF文件.我目前还没有遇到问题 因为我这个是用来读取INF文件中的信息的. 例子中使用BOOT.INI是为了简单.

作者: oumigaiiii     时间: 2007-3-13 12:10
双击没反应,一闪过去了,该怎么用啊?晕

作者: lxmxn     时间: 2007-3-13 12:26
Originally posted by oumigaiiii at 2007-3-12 23:10: 双击没反应,一闪过去了,该怎么用啊?晕
  看看楼主前面写的使用方法!

作者: oumigaiiii     时间: 2007-3-13 13:10
Originally posted by lxmxn at 2007-3-12 11:26 PM:   看看楼主前面写的使用方法!
我看了,那个例子那几行,在哪输???怎么调用??

作者: lxmxn     时间: 2007-3-13 13:14
Originally posted by oumigaiiii at 2007-3-13 00:10: 我看了,那个例子那几行,在哪输???怎么调用??
  在命令提示符CMD和批处理文件中调用,要带参数运行,比如:"inifile c:\windows\control.ini",批处理文件中可以:"call inifile c:\windows\control.ini"

作者: axi     时间: 2007-3-14 01:05
研究一下,因为我也需要这样的程序。

作者: electronixtar     时间: 2007-3-14 02:41
忘记加分了,补上

作者: yangzhiyi     时间: 2007-3-14 03:39
刚好需要,谢谢

作者: yangzhiyi     时间: 2007-3-17 07:52
还差一个参数没有啊,应该还有一个功能能读出项目的数值 如 timeout=3 得到 3 现在 inifile c:\boot.ini "[boot loader]" timeout :: 显示c:\boot.ini [boot loader]段 timeout的值 只能读出成 timeout=3

作者: zzttff     时间: 2007-3-19 11:08
都是高手啊

作者: chenall     时间: 2007-3-19 14:30
Originally posted by yangzhiyi at 2007-3-17 07:52 AM: 还差一个参数没有啊,应该还有一个功能能读出项目的数值 如 timeout=3 得到 3 现在 inifile c:\boot.ini "[boot loader]" timeout :: 显示 ...
这个自己再用批处理来读取吧. 也可以自己修改批处理,让它将timeout设为一个坏境变量就是timeout的值3

作者: haogaogx     时间: 2007-3-22 19:44
yun

作者: pmwz008     时间: 2007-3-23 05:58
提示命令语法不正确

作者: nicesoft     时间: 2007-4-17 01:54
好东西

作者: rrrrrrr     时间: 2007-4-25 07:36
谢谢分享

作者: chenall     时间: 2007-4-26 11:56
07-04-25 新增了一个设置变量的功能.具体看里面的注释 有需要该功能的朋友可以测试一下.

作者: yh6688     时间: 2007-6-1 16:21
ok

作者: xlaoma     时间: 2007-6-25 15:38
楼主可不可以加点注释,我有点看不明白。

作者: slam     时间: 2007-6-30 19:21    标题: 为什么这条批处理之后不能再执行其它的批处理啊?
请问一下,我另作一个批处理,先执行inifile,然后执行其它的批处理,但发现总是inifile 执行完了就停止了为什么会这样啊?

作者: ztosen     时间: 2007-7-28 21:38
谢谢楼主的分享

作者: abao6160     时间: 2008-1-19 12:24
学习了。。。。。。。。。。。。。。

作者: flasharmy     时间: 2008-1-19 20:56
学习了

作者: SamuelFish     时间: 2008-1-21 19:30
看得有点晕

作者: yangzhiyi     时间: 2008-3-12 12:11
刚好要用到, 还提两个建议 能读取所有字段名,如得到 [boot loader] [operating systems] 再一个读取一个字段得到所有项目名 timeout default 设置变量的功能加多能只显示项目值功能 [字段名] 输入时不用输入 [] 能加多修改功能就最好,成行替换好像也不是太难。 最后问下 if /i "!a!"=="%item%" ( if "%setvar%"=="1" ( endlocal&set "%%x" echo %item% 想显示值, 怎么不行啊, echo %%item%%也不行 [ Last edited by yangzhiyi on 2008-3-12 at 01:05 PM ]

作者: wo521lishu     时间: 2008-3-17 14:59

作者: haroldzhh     时间: 2008-4-3 17:02
非常不错,下载回来学习一下

作者: kinghero     时间: 2008-4-3 17:28
又是积分!!!!!!!!

作者: knightak     时间: 2008-4-3 23:16
收藏了非常好用,多谢作者。

作者: computeryi     时间: 2008-4-4 01:10
为了一点积分,我顶

作者: rongcong005     时间: 2008-4-6 18:25
好像一运行后就自动退出了。不能执行下一语句。。。。。。

作者: knoppix7     时间: 2008-4-6 19:30
你加参数没有!!!

作者: gao123     时间: 2008-4-7 17:54    标题: woding
jiafen

作者: 344611734     时间: 2008-4-12 15:31
好东西顶起!别下沉了 !

作者: xueshe16x     时间: 2008-4-21 12:36
Originally posted by yangzhiyi at 2007-3-17 07:52 AM: 还差一个参数没有啊,应该还有一个功能能读出项目的数值 如 timeout=3 得到 3 现在 inifile c:\boot.ini "[boot loader]" timeout :: 显示 ...
================================= 可以在下面添加下面代码 for /f "delims=;" %%x in ("%%i=%%j") do ( if not DEFINED item (echo %%x) else ( setlocal EnableDelayedExpansion call :trim a if /i "!a!"=="%item%" ( if "%setvar%"=="1" ( endlocal&set "%%x" ) else ( call :item_v " %%x" rem endlocal&echo %%x ) ) ) ) :item_v set a=%1 endlocal&echo %a:~6,1% //这里要取多少个值你可以自己设置 或再加点代码来自动取值..... goto :eof

作者: rzwwj1     时间: 2008-4-21 20:26
下来,看看。。。。。。。。。

作者: stance     时间: 2008-5-4 11:10
謝謝chenall,學習了。

作者: dslz666     时间: 2008-5-10 11:47
好贴,学习了,顶上去,别让好贴沉下去

作者: hackerXJZS     时间: 2008-11-21 09:06
正好需要到..谢谢了..

作者: hackerXJZS     时间: 2008-11-21 09:06
正好需要到..谢谢了..