Board logo

标题: [求助]提取文件中格式类似的字符[有点难坛论没见过的] [打印本页]

作者: baikaifang     时间: 2007-6-2 23:23    标题: [求助]提取文件中格式类似的字符[有点难坛论没见过的]

[求助]提取文件中格式类似的字符,这些文件并不在同一个目录

先说明一下:
      需要提取内容的文件,分布在不同的文件夹内.并且所在的文件夹层次也不一样. 同时还要在输出的内容后面追加该文件的路径

这是文件夹结构:

C:\SRS-DRV
├─3
│  ├─1
│  │  └─O
│  ├─2
│  └─3
├─A
│  ├─1
│  ├─2
│  ├─3
│  ├─4
│  ├─5
│  ├─6
│  ├─7
│  └─8
├─AD
│  ├─1
│  ├─2
│  ├─3
│  ├─4
│  ├─5
│  ├─6
│  │  └─C
│  ├─7
│  ├─8
│  ├─9
│  └─A
├─AM
├─AR
├─AT
├─AU
│  ├─1
│  ├─2
│  └─3
├─C
├─D
│  ├─1
│  ├─2
│  └─3
├─E
├─H
│  ├─1
│  │  └─R
│  ├─2
│  ├─3
│  ├─4
│  ├─5
│  ├─6
│  │  └─2k3
│  ├─7
│  └─8
├─I
│  ├─1
│  ├─2
│  ├─3
│  ├─4
│  ├─5
│  └─6
├─IN
│  ├─1
│  │  └─O
│  └─2
│      └─winnt
│          └─x86
├─IT
├─J
│  ├─1
│  └─2
├─L
│  ├─1
│  ├─2
│  ├─3
│  ├─4
│  └─5
├─M
│  └─O
├─N
│  ├─123
│  ├─4
│  │  ├─I
│  │  └─R
│  ├─4INTEL
│  │  ├─I
│  │  └─R
│  ├─590SLI
│  │  ├─I
│  │  └─R
│  └─TM
├─P
│  ├─1
│  ├─2
│  │  └─A
│  ├─3
│  ├─4
│  ├─5
│  ├─6
│  ├─7
│  ├─8
│  └─9
├─Q
│  ├─1
│  ├─2
│  ├─3
│  └─4
├─S
│  ├─1
│  ├─2
│  ├─3
│  ├─4
│  ├─5
│  │  └─A
│  ├─6
│  ├─7
│  │  └─A
│  ├─8
│  ├─9
│  ├─A
│  ├─B
│  └─C
├─SI
│  ├─1
│  ├─2
│  └─3
├─V
│  ├─1
│  ├─2
│  └─3
└─VM


基本上每个文件夹下面都有一个扩展名为.INF的文件,如果那个INF文件中有和下面红色部分类似的内容就将它输出到1.TXT中(有的文件里有多行这样的,要全部都输出),并且将该文件的路径追加到输出文本的后面。(如果某个文件中有多处符合条件的,就全部输出,并且在每一行后面添加该文件的路径,例如后面几行蓝色的)

例如:
PCI\VEN_13C1&DEV_1000=C:\SRS-DRV\3\3\oemsetup3.inf
PCI\VEN_1191&DEV_0002&SUBSYS_00021191=C:\SRS-DRV\A\1\Aec6210.inf
PCI\VEN_1191&DEV_0006&SUBSYS_00061191&REV_01=C:\SRS-DRV\A\2\Aec6260.inf
PCI\VEN_1022&DEV_7409=C:\SRS-DRV\AM\AMDEIDE.inf
PCI\VEN_1022&DEV_7411=C:\SRS-DRV\AM\AMDEIDE.inf
PCI\VEN_1022&DEV_7441=C:\SRS-DRV\AM\AMDEIDE.inf
PCI\VEN_1022&DEV_7469=C:\SRS-DRV\AM\AMDEIDE.inf

前面的部分是从文件里面提出来的,等号后面是提取内容的文件的路径.
要提取的内容有几个相似的特点:
1 都是以PCI\VEN开头.(注意:这里是指我要提取的内容是以PCI\VEN开头,并非该内容所在的行是PCI\VEN开头.只需要PCI\VEN之间包含一个"\"的内容,超过一个"\"以上的都不是需要的)
2 内容中有两种分隔符"_"和"&",并且分隔符的数量不一样.

下面的链接页面的文件,是上面制作1.TXT文件用到的,上面的目录树结构就是该链接文件的.
http://driverpacks.net/DriverPacks/download.php?pag=m

所用到的文件上面链接页面有下载,我的等级太低了,现在好像还无法上传附件!
在这里先感谢各位大侠们了.


希望用批处理实现上面功能的初衷:

  Quote:
   原帖引用之龙帝国论坛        由 eyeshare 于 07-5-3 11:07 发表
封装前加载sata raid scsi 驱动的心得,可以不用不改的srs


做ghost系统我觉得最重要的就是电源模式的判断和准确加载srs 驱动,现在电源模式的判断已经有了很好的解决办法,现在最主要的问题就在于srs 的驱动怎样在封装前加载,和最小化安装的时候卸载多余的驱动,加快系统启动速度。其实参考微软的部署文档就可以了。下面我来说说我的方法(封装前其他的步骤我就不多说了 如:更改电源模式等)

1,收集需要的srs驱动,可以直接下载dps 的massstorage 驱动。
http://www.driverpacks.net/DriverPacks/download.php?pag=m
2,解压驱动到c:\drivers 。
3,编辑sysprep.ini 加入以下内容
InstallFilesPath=C:\sysprep\i386

[SysprepMassStorage]
PCI\VEN_1022&DEV_7469=c:\drivers\m\am\AMDEIDE.inf
PCI\VEN_1002&DEV_4349=c:\drivers\m\at\atiide.inf
PCI\VEN_10B9&DEV_5215=c:\drivers\m\au\1\ALIIDE.INF
PCI\VEN_10B9&DEV_5219=c:\drivers\m\au\1\ALIIDE.INF
PCI\VEN_10B9&DEV_5229=c:\drivers\m\au\1\ALIIDE.INF
PCI\VEN_10B9&DEV_5228=c:\drivers\m\au\2\m5228.INF
PCI\VEN_10B9&DEV_5281=c:\drivers\m\au\2\m5281.inf
PCI\VEN_10B9&DEV_5287=c:\drivers\m\au\3\ulisata.inf
PCI\VEN_10B9&DEV_5288=c:\drivers\m\au\4\ULISATA.INF
PCI\VEN_10B9&DEV_5289=c:\drivers\m\au\5\ULISATA.INF
PCI\VEN_8086&DEV_2652&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_27C3&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_2682&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_27C6&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_2822&CC_0104=c:\drivers\m\in\1\iastor.inf
PCI\VEN_8086&DEV_2652&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_2653&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_27C1&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_27C5&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_2681&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_2821&CC_0106=c:\drivers\m\in\1\iaahci.inf
PCI\VEN_8086&DEV_24DF&CC_0104=c:\drivers\m\in\1\O\iastor.inf
PCI\VEN_8086&DEV_25B0&CC_0104=c:\drivers\m\in\1\O\iastor.inf
PCI\VEN_10DE&DEV_008E=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_00D5=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_00EE=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_00E3=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0036=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_003E=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0054=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0055=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0266=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_0267=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_036F=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_037E=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_037F=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_03F6=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_03F7=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_10DE&DEV_03E7=c:\drivers\m\N\TM\nvatabus.inf
PCI\VEN_1039&DEV_0181=c:\drivers\M\SI\1\SISRaid1.INF
PCI\VEN_1039&DEV_0180=c:\drivers\M\SI\2\SISRaid.INF
PCI\VEN_1039&DEV_0182=c:\drivers\M\SI\3\SISRaid2.INF
PCI\VEN_1106&DEV_3349&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_6287&CC_0106=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_0591&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_3249&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_3149&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_3164&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_0581&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_7372&CC_0104=c:\drivers\M\V\1\VIAMRAID.INF
PCI\VEN_1106&DEV_4149=c:\drivers\M\V\2\viapide.inf
PCI\VEN_1106&DEV_0571=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_3149&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_0591&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_5337&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_3349&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_5287&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_3164&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_0581&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_1106&DEV_5324&CC_0101=c:\drivers\M\V\3\vminiide.inf
PCI\VEN_104B&DEV_1040=c:\drivers\M\VM\vmscsi.inf


这个是我加载的驱动 包括nforece intel via  sis ali amd 的sata驱动,如果还需要加载其他驱动可以参考驱动包内的 DriverPack_MassStorage_wnt5_x86-32.ini 文件。
4,在c:\sysprep 目录下建立 i386\$oem$目录 ,在c:\sysprep\i386\$oem$ 中建立cmdlines.txt 文件,在文件中加入
[Commands]
"c:\sysprep\sysprep -clean"

这样就会在最小化安装的过程中禁用所有因为在目标计算机上不存在而未安装的大量存储控制器。

5,最后执行sysprep进行封装,在封装的过程中,系统会自动安装 srs驱动。在最小化安装的时候会删除多余的驱动。

这样做的好处是自己可以控制加载的驱动更符合自己的需要,坏处就是需要手动添加比较麻烦。

引用文章原贴地址http://bbs.mscode.cc/thread-51438-1-2.html

[ Last edited by baikaifang on 2007-6-3 at 08:04 PM ]
作者: namejm     时间: 2007-6-3 15:09
  放了那么久都没人理睬,我来试试看。

  先问问楼主:"前面的部分是从文件里面提出来的",这个文件到底什么样?你最好把它作为附件发出来。
作者: electronixtar     时间: 2007-6-3 15:14
不要拿难来吓人

findstr /r /i "PCI\\VEN.*&DEV_"
作者: wudixin96     时间: 2007-6-3 15:20
偶试过了。他的文件夹下的inf文件里的内容极不规则的。

PCI\\VEN.*&DEV前时不时有空格等出现。

要过滤好几次才能提出来。

希望namejm、electronixtar等老大能出个效率高的。期待……
作者: lxmxn     时间: 2007-6-3 15:39
不明白怎么1.txt文件里面的=号后面的文件路径和上面文件夹的树形结构不一样了,汗。。
@echo off
for /f "delims=: tokens=1*" %%a in ('findstr /sirc:"^PCI\\\VEN_....&" C:\SRS-DRV\*.inf') do (
        echo\%%b=%%a>>1.txt
)
start 1.txt

作者: wudixin96     时间: 2007-6-3 15:44
PCI\\\VEN为什么有三个\。不是两个吗?

而且inf文件里的结构是这样的%DEVICE_DESCRIPTION% = Install, PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1
并不是以PCI\VEN打头的。



不好意思。想复杂了。多余了。

[ Last edited by wudixin96 on 2007-6-3 at 04:12 PM ]
作者: lxmxn     时间: 2007-6-3 15:49


  Quote:
Originally posted by wudixin96 at 2007-6-3 15:44:
PCI\\\VEN为什么有三个\。不是两个吗?

而且inf文件里的结构是这样的%DEVICE_DESCRIPTION% = Install, PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1
并不是以PCI\VEN打头的。

第一个\对第二个\取消转义,得到一个“真实”的\,然后这个\去取消第三个\的特殊意义。(我是这样理解的)

至于不是以PCI\VEN打头,我是看楼主的说明这样写的:

  Quote:
要提取的内容有几个相似的特点:
1 都是以PCI\VEN开头.


作者: baikaifang     时间: 2007-6-3 19:07


  Quote:
Originally posted by namejm at 2007-6-3 15:09:
  放了那么久都没人理睬,我来试试看。

  先问问楼主:"前面的部分是从文件里面提出来的",这个文件到底什么样?你最好把它作为附件发出来。

所用到的文件,就是一楼最下面那个链接下载的呀.
作者: baikaifang     时间: 2007-6-3 19:10


  Quote:
Originally posted by electronixtar at 2007-6-3 15:14:
不要拿难来吓人

findstr /r /i "PCI\\VEN.*&DEV_"

electronixtar 大侠,我只会一些简单的批处理,把贴子标题写成那样,只希望能得到各位大侠的帮忙,请别见怪!

[ Last edited by baikaifang on 2007-6-3 at 07:48 PM ]
作者: baikaifang     时间: 2007-6-3 19:23


  Quote:
Originally posted by wudixin96 at 2007-6-3 15:44:
PCI\\\VEN为什么有三个\。不是两个吗?

而且inf文件里的结构是这样的%DEVICE_DESCRIPTION% = Install, PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1
并不是以PCI\VEN打头的 ...

不好意思,是我表达的模糊了一点,我所指的以PCI\VEN开头,是我要提取的内容都是PCI\VEN开头的,并不是在以PCI\VEN开头所在的行.
作者: baikaifang     时间: 2007-6-3 19:32


  Quote:
Originally posted by lxmxn at 2007-6-3 15:39:
不明白怎么1.txt文件里面的=号后面的文件路径和上面文件夹的树形结构不一样了,汗。。

[code]
@echo off
for /f "delims=: tokens=1*" %%a in ('findstr /s ...

不好意思,是我没注意到,已重新修改一楼贴子了.:D
作者: baikaifang     时间: 2007-6-4 16:28
等了一天了没人顶,自己来一下
作者: terse     时间: 2007-6-4 16:34
lxmxn版主不是帮写好了?
作者: lxmxn     时间: 2007-6-4 16:38


  Quote:
Originally posted by baikaifang at 2007-6-4 16:28:
等了一天了没人顶,自己来一下

不要怪别人没有看,你的意思根本没有说清楚,所以大家也懒得看了。

说不清楚举个例子出来,不要说一些有歧义的话。
作者: terse     时间: 2007-6-4 18:03
@echo off
for /f "tokens=1* delims=:" %%i in ('findstr /risc:"PCI\\\VEN_....&" *.inf') do (
echo %%j=%%~fdpi >>123.txt
)
pause
在lxmxn版主的写的上面多个路径  是不是你要的?
作者: baikaifang     时间: 2007-6-4 22:37


  Quote:
Originally posted by lxmxn at 2007-6-4 16:38:

不要怪别人没有看,你的意思根本没有说清楚,所以大家也懒得看了。

说不清楚举个例子出来,不要说一些有歧义的话。

lxmxn版主你好,是我的不对,你别怪我了好吗,在这里跟你说声"对不起",也要谢谢你的支持

terse 朋友,我用你上面改进 lxmxn版主 的批处理
@echo off
for /f "tokens=1* delims=:" %%i in ('findstr /risc:"PCI\\\VEN_....&" *.inf') do (
echo %%j=%%~fdpi >>123.txt
)
pause

提取出来的内容是下面这样的
%DEVICE_DESCRIPTION_9K% = Install, PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1=C:\M\3\1\O\oemsetup.inf
%DEVICE_DESCRIPTION_9X% = Install, PCI\VEN_13C1&DEV_1003&SUBSYS_100313C1=C:\M\3\1\O\oemsetup.inf
%aec6897.DeviceDesc% = aec689x_Inst, PCI\VEN_1191&DEV_000B&SUBSYS_1191000B=C:\M\A\6\aec6897.inf
%aec6898.DeviceDesc% = aec689x_Inst, PCI\VEN_1191&DEV_000B&SUBSYS_11916898=C:\M\A\6\aec6897.inf
%PCI\VEN_9005&DEV_00C0&SUBSYS_F6209005.DeviceDesc% = adpu160m_Inst,PCI\VEN_9005&DEV_00C0&SUBSYS_F6209005=C:\M\AD\5\ADPU160M.INF
%PCI\VEN_9005&DEV_00C0&SUBSYS_F6200E11.DeviceDesc% = adpu160m_Inst,PCI\VEN_9005&DEV_00C0&SUBSYS_F6200E11=C:\M\AD\5\ADPU160M.INF
能再改进一下,只输出红色部分的内容吗!真的谢谢您

[ Last edited by baikaifang on 2007-6-4 at 10:50 PM ]
作者: baikaifang     时间: 2007-6-4 23:04


  Quote:
Originally posted by lxmxn at 2007-6-3 15:49:


第一个\对第二个\取消转义,得到一个“真实”的\,然后这个\去取消第三个\的特殊意义。(我是这样理解的)

至于不是以PCI\VEN打头,我是看楼主的说明这样写的:

版主,我试了一下,二个"\",和三个"\",在我这里使用,输出的内容是一样的.
作者: terse     时间: 2007-6-4 23:12
问题是你不是没每行都是这样的  有的有,有的还是没吧?
要是每行都这样那还可以
作者: baikaifang     时间: 2007-6-4 23:16
是呀,提取出来的内容好乱,有很多是不需要的,也输出了,还有很多重复的.看来真难搞呀.
作者: terse     时间: 2007-6-5 00:22
再改一下版主的:
@echo off&setlocal enabledelayedexpansion
for /f "delims=: tokens=1*" %%i in ('findstr /ris "PCI\\\VEN_....&" *.inf') do (
          set "m=%%j"
       set n=%%~fdpxi
        set "m=!m:*,=!"
echo !m!=!n! >>test.txt
)
pause
作者: lxmxn     时间: 2007-6-5 00:39
试试这个,需要外部命令grep。
@echo off
for /r C:\M\ %%a in (*.inf) do (
        for /f "tokens=1* delims=:" %%b in ('grep -o "PCI\\VEN_[[:alnum:]]\{4\}&DEV_[[:alnum:]]\{4\}&SUBSYS_[[:alnum:]]\{8\}" "%%a"') do (
        echo\%%b=%%a>>result.txt
        )
)
grep 下载地址:http://zhenlove.com.cn/cndos/fileup/files/grep.rar
作者: baikaifang     时间: 2007-6-5 20:57


  Quote:
Originally posted by terse at 2007-6-5 00:22:
再改一下版主的:
@echo off&setlocal enabledelayedexpansion
for /f "delims=: tokens=1*" %%i in ('findstr /ris "PCI\\\VEN_....&" *.inf') do (
          set &quo ...

比前面的效果好一些了,不过还是有很多不需要的.例如:
PCI\VEN_9004&DEV_7815.DeviceDesc="Adaptec Memory Controller / XOR Engine" =C:\M\AD\8\oemsetup.inf
SupportedSubsystemIDs,%PCI\VEN_1095&DEV_3512.DeviceDesc%,0x00010001, 0x35121095=C:\M\AD\9\ASH1205.inf
%Win98SupportedControllersSubKey%,%PCI\VEN_1095&DEV_3512.DeviceDesc%,0x00010001, 0x35121095=C:\M\AD\9\ASH1205.inf
PCI\VEN_8086&DEV_24DF.DeviceDesc = "Adaptec Embedded Serial ATA HostRAID"=C:\M\AD\A\AARICH.INF

辛苦大侠了.
下面 lxmxn 版主的基本上可以了.有一些重复的.不过可以手工删除就行了.

  Quote:
Originally posted by lxmxn at 2007-6-5 00:39:
试试这个,需要外部命令grep。
[code]
@echo off
for /r C:\M\ %%a in (*.inf) do (
        for /f "tokens=1* delims=:" %%b in ('grep -o "PCI\\VEN_[[:alnum:]]\{4\}&DEV_[[:aln ...

版主真厉害,上面的代码,非常好.非常感谢
提取出来的内容是同样长度的,下面是效果:
PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1=C:\M\3\1\oemsetup1.inf
PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1=C:\M\3\1\O\oemsetup.inf
PCI\VEN_13C1&DEV_1003&SUBSYS_100313C1=C:\M\3\1\O\oemsetup.inf

还有与上面长度不一样的没能提出来:
PCI\VEN_13C1&DEV_1000
PCI\VEN_1103&DEV_0004&REV_03

[ Last edited by baikaifang on 2007-6-5 at 09:17 PM ]
作者: baikaifang     时间: 2007-6-5 21:14
如果版主,把代码改下,对3种格式的分别处理,就可以把3种格式的全部提出来,最后把输出的文件组合起来也行.
顺便问下,下面这句的具体意思.我好搞懂可以自己修改一下.提取不同格式的内容.
for /f "tokens=1* delims=:" %%b in ('grep -o "PCI\\VEN_[[:alnum:]]\{4\}&DEV_[[:alnum:]]\{4\}&SUBSYS_[[:alnum:]]\{8\}" "%%a"')

谢谢
作者: lxmxn     时间: 2007-6-5 21:52
Re baikaifang:

你要提取的类似“PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1”这样的字符串有什么特点可以“利用”呢?

如果有一些区别其它字符串的特点,我想事情也会变得容易些的。

至于这个 grep 命令,是查找匹配的字符并且只输出匹配的字符,如果想深入学习它的用法,可以到网上搜索相关的资料来看看。