[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理如何读取出ini文件中的指定节点及其下键值对

本帖最后由 pcl_test 于 2016-9-8 22:34 编辑

=== 本贴解决了两个处理INI文件的问题! ===

最近要整理一些INI配置文件, 想通过批处理实现高效作业.

要求:
1, 获取各 [...] 标签的名字并赋值, 并分别输出下面相关的行;
2, 忽略以";"开头的行, 也无需保留空行;
3, 无临时文件, 速度快.
  1. ......
  2. [FILE]
  3. ; 系统启动文件
  4. %SystemDriver%\autoexec.bat
  5. %SystemDriver%\config.sys
  6. %SystemDriver%\io.sys
  7. %SystemDriver%\msdos.sys
  8. %SystemDriver%\ntldr
  9. [FOLDER]
  10. %ProgramFiles%\Internet Explorer
  11. ......
复制代码
不知道标签名, 想要读取出标签名 "FILE"和"FOLDER", 并分别输出该标签内的所有行, 如何实现?

拜托了!

本帖最后由 aries215 于 2012-4-8 20:46 编辑

回复 29# fatcat
好码! 聪明! 我咋没想到呢~?

TOP

回复 28# aries215
  1. @echo off & setlocal enabledelayedexpansion
  2. > b.txt (for /f "delims=" %%l in ('findstr /v "^$" a.txt^|findstr /b /v ";"') do (
  3.   set "lin=%%l"
  4.   if "!lin:~0,1!"=="[" (echo !lin:~1,-1!) else echo %%l
  5. ))
复制代码
1

评分人数

TOP

我自己整的只能显示最后一组标签的相关内容, 前面的被忽略掉了:
FOLDER
%ProgramFiles%\Internet Explorer

代码如下:
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /f "delims=[]" %%a in ('findstr "^\[" a.txt') do set opt=%%a
  4. for /f "delims=:" %%i in ('findstr /in "!opt!" a.txt') do set n=%%i
  5. for /f "skip=%n% delims=" %%i in ('type a.txt') do (
  6. set "str=%%i"
  7. if not "!str:~0,1!"=="[" (echo !opt!&echo !str!) else (
  8. pause
  9. goto :eof
  10. )
  11. )
  12. pause
复制代码
怎么能分别输出INI的所有有效行??

TOP

本帖最后由 aries215 于 2012-4-8 18:46 编辑

回复 26# find
这个能合并到一起吗?

就是说, 从第一个"[]"开始逐行输出整个INI文件的内容, 碰到"[]"就获取标签的名字赋值给另一个变量, 以便使用不同的命令参数来处理, 只使用一次findstr命令行不?

像上面25楼的INI格式, 我要分别对里面的文件和文件夹分开用不同的命令参数来处理, 应该是用什么方式比较合适??

TOP

回复 25# aries215


    读取标签名:
  1. @echo off
  2. for /f "delims=[]" %%a in ('findstr "^\[" a.txt') do (
  3.     echo %%a
  4. )
  5. pause
复制代码
早中晚各问自己一遍:你平均每周帮助别人解决几个问题?

TOP

本帖最后由 aries215 于 2012-4-8 17:14 编辑

回复 16# apang
还有疑问!

我在处理一些文件和文件夹的时候, 需要针对不同类型的对象采用不同的处理方式.

比如我想要对下面这个列表分别使用不同的命令进行处理:
  1. ......
  2. [FILE]
  3. ; 系统启动文件
  4. %SystemDriver%\autoexec.bat
  5. %SystemDriver%\config.sys
  6. %SystemDriver%\io.sys
  7. %SystemDriver%\msdos.sys
  8. %SystemDriver%\ntldr
  9. [FOLDER]
  10. %ProgramFiles%\Internet Explorer
  11. ......
复制代码
假如我不知道标签名, 想要读取出标签名 "FILE"和"FOLDER", 并分别输出该标签内的所有行, 如何实现?

拜托各位了!

TOP

哦, 好了. 非常感谢 apang , fatcat , gawk , find !!
特别鸣谢 apang 不厌其烦的解答!

TOP

"[INTEL"你改了吗
如改成[REGISTR

TOP

本帖最后由 aries215 于 2012-4-8 16:42 编辑

前面的那些代码, 套到别的样品中, 结果不对, 整不出来啊.

TOP

回复 20# aries215

在命令提示符下分别输入findstr /in "[INTEL" a.txt
和find /i /n "[INTEL" a.txt 就知道是啥意思了,呵呵

TOP

回复 16# apang
请问一下, "delims=:" 是什么意思? 貌似我的样本里面没有":"字符啊.
不过结果也对的.

TOP

行数越少, 感觉越复杂了, 还得自己再次排版.
行数不重要, 其实我前面只是说能不能精简的意思, 不是单纯要求行数少.

TOP

2行:
  1. @echo off&setlocal EnableDelayedExpansion&for /f "delims=[] skip=2" %%i in ('find /i /n "[INTEL" a.txt') do set n=%%i
  2. (for /f "eol=; skip=%n% delims=" %%i in ('type a.txt') do (set "str=%%i"&(if not "!str:~0,1!"=="[" (echo !str!) else goto :eof)))>b.txt
复制代码
早中晚各问自己一遍:你平均每周帮助别人解决几个问题?

TOP

本帖最后由 aries215 于 2012-4-8 15:18 编辑

大侠请息怒~

顺便帮忙把输出到文件改成echo吧~

TOP

返回列表