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

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

[复制链接]
发表于 2012-4-8 15:12:58 | 显示全部楼层
用find要忽略2行,用findstr不用加skip,eol=;可以不要。至少6行,再少不会搞了。。。
  1. @echo off&setlocal EnableDelayedExpansion
  2. for /f "delims=:" %%i in ('findstr /in "[INTEL" a.txt') do set n=%%i
  3. for /f "skip=%n% delims=" %%i in ('type a.txt') do (
  4.   set "str=%%i"&(if not "!str:~0,1!"=="[" (echo !str!) else pause&goto :eof)
  5. )
  6. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
aries215 + 1 特别鸣谢~

查看全部评分

 楼主| 发表于 2012-4-8 15:17:04 | 显示全部楼层
本帖最后由 aries215 于 2012-4-8 15:18 编辑

大侠请息怒~

顺便帮忙把输出到文件改成echo吧~
发表于 2012-4-8 15:17:15 | 显示全部楼层
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
复制代码
 楼主| 发表于 2012-4-8 15:27:48 | 显示全部楼层
行数越少, 感觉越复杂了, 还得自己再次排版.
行数不重要, 其实我前面只是说能不能精简的意思, 不是单纯要求行数少.
 楼主| 发表于 2012-4-8 15:32:06 | 显示全部楼层
回复 16# apang
请问一下, "delims=:" 是什么意思? 貌似我的样本里面没有":"字符啊.
不过结果也对的.
发表于 2012-4-8 15:37:16 | 显示全部楼层
回复 20# aries215

在命令提示符下分别输入findstr /in "[INTEL" a.txt
和find /i /n "[INTEL" a.txt 就知道是啥意思了,呵呵
 楼主| 发表于 2012-4-8 15:44:12 | 显示全部楼层
本帖最后由 aries215 于 2012-4-8 16:42 编辑

前面的那些代码, 套到别的样品中, 结果不对, 整不出来啊.
发表于 2012-4-8 16:01:20 | 显示全部楼层
"[INTEL"你改了吗
如改成[REGISTR
 楼主| 发表于 2012-4-8 16:16:03 | 显示全部楼层
哦, 好了. 非常感谢 apang , fatcat , gawk , find !!
特别鸣谢 apang 不厌其烦的解答!
 楼主| 发表于 2012-4-8 17:06:51 | 显示全部楼层
本帖最后由 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", 并分别输出该标签内的所有行, 如何实现?

拜托各位了!
发表于 2012-4-8 17:46:23 | 显示全部楼层
回复 25# aries215


    读取标签名:
  1. @echo off
  2. for /f "delims=[]" %%a in ('findstr "^\[" a.txt') do (
  3.     echo %%a
  4. )
  5. pause
复制代码
 楼主| 发表于 2012-4-8 18:37:59 | 显示全部楼层
本帖最后由 aries215 于 2012-4-8 18:46 编辑

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

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

像上面25楼的INI格式, 我要分别对里面的文件和文件夹分开用不同的命令参数来处理, 应该是用什么方式比较合适??
 楼主| 发表于 2012-4-8 18:59:26 | 显示全部楼层
我自己整的只能显示最后一组标签的相关内容, 前面的被忽略掉了:
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的所有有效行??
发表于 2012-4-8 20:12:25 | 显示全部楼层
回复 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技术 +1 收起 理由
aries215 + 1 好码!

查看全部评分

 楼主| 发表于 2012-4-8 20:43:28 | 显示全部楼层
本帖最后由 aries215 于 2012-4-8 20:46 编辑

回复 29# fatcat
好码! 聪明! 我咋没想到呢~?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 03:30 , Processed in 0.034119 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表