Board logo

标题: [文本处理] [已解决]批处理怎样查找特殊TXT文件的指定特殊字符后面的字符,并赋予一个变量? [打印本页]

作者: jackesy    时间: 2011-9-15 20:23     标题: [已解决]批处理怎样查找特殊TXT文件的指定特殊字符后面的字符,并赋予一个变量?

本帖最后由 jackesy 于 2011-9-16 13:45 编辑

请教,有这么一个txt文件AA.TXT,里面全部是 一下类似代码
  1. 723fb954-d931-4348-b672-82a188e587b5.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\723fb954-d931-4348-b672-82a188e587b5.dsm|0|7|0
  2. 2fe0b7ef-4e24-4ab9-9c6e-e8b75791605e.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\2fe0b7ef-4e24-4ab9-9c6e-e8b75791605e.dsm|0|7|0
  3. f9d63b68-88f7-4a29-bd4a-014a3834c700.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\f9d63b68-88f7-4a29-bd4a-014a3834c700.dsm|0|7|0
  4. c1b932f5-431a-4774-9f12-5f9b6dcdd266.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\c1b932f5-431a-4774-9f12-5f9b6dcdd266.dsm|0|7|0
  5. 90cc9074-a3e8-4e1a-87e6-6f630422451d.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\90cc9074-a3e8-4e1a-87e6-6f630422451d.dsm|0|7|0
  6. ec0deea5-98fe-4ed8-80c8-8f04f3b5f300.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\ec0deea5-98fe-4ed8-80c8-8f04f3b5f300.dsm|0|7|0
  7. 010befdf-a6bd-4ec5-8ba5-9a4ab5c97219.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\010befdf-a6bd-4ec5-8ba5-9a4ab5c97219.dsm|0|7|0
  8. 18f34778-395e-4145-8357-7a038f60a34a.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\18f34778-395e-4145-8357-7a038f60a34a.dsm|0|7|0
  9. e7fc93e9-37b0-4333-92b5-6e07ffeeecfb.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\e7fc93e9-37b0-4333-92b5-6e07ffeeecfb.dsm|0|7|0
  10. 276fcdaf-8ebb-4ae1-832a-12aeb0f13c8a.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\276fcdaf-8ebb-4ae1-832a-12aeb0f13c8a.dsm|0|7|0
  11. e01f2da1-69cb-48f3-9826-301328c53c1d.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\e01f2da1-69cb-48f3-9826-301328c53c1d.dsm|0|7|0
  12. 0b2ca530-11a7-4f66-888f-f4428a3d1639.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\0b2ca530-11a7-4f66-888f-f4428a3d1639.dsm|0|7|0
  13. 4ce5a4c7-5e52-4e13-a58d-d165e618eb4e.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\4ce5a4c7-5e52-4e13-a58d-d165e618eb4e.dsm|0|7|0
  14. 1115a7db-611e-483d-bb16-978ea2a06d62.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\1115a7db-611e-483d-bb16-978ea2a06d62.dsm|0|7|0
  15. fefc7953-aa8e-44f6-ba1e-01f0f2712a1c.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\fefc7953-aa8e-44f6-ba1e-01f0f2712a1c.dsm|0|7|0
  16. simtkit.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\simtkit.dll|1|4|0
  17. simtkui.lnk|D:\G920\DIYRom\MYG920DIY\SYS\SYS_29017\SIM_TKit\simtkui.lnk|0|6|0
  18. simtkui.lnk=|D:\G920\DIYRom\MYG920DIY\SYS\SYS_29017\SIM_TKit\simtkui.lnk|0|6|0
  19. wince.nls|D:\G920\DIYRom\MYG920DIY\SYS\SYS_29017\WinCENLS_Lang_0804\wince.nls|0|6|0
  20. exsmime.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\exsmime.dll|1|4|0
  21. kbdus.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\kbdus.dll|1|6|0
  22. mstscax.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\mstscax.dll|1|4|0
  23. MvkLib.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\MvkLib.dll|1|4|0
  24. wpctsc.exe|D:\G920\DIYRom\MYG920DIY\Temp\Dump\wpctsc.exe|1|4|0
  25. wpctsc.lnk|D:\G920\DIYRom\MYG920DIY\SYS\SYS_29017\RemoteDesktopMobile\wpctsc.lnk|0|6|0
  26. Avrcp_MPplugin.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\Avrcp_MPplugin.dll|1|4|0
  27. bta2dp.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\bta2dp.dll|1|6|0
复制代码
现在需要从AA.TXT 文件中 查找“SYS\SYS_”这个字符串(只有这一个地方是固定的字符串),得到后面的29017(主要是得到这五个字符) 固定的五位字符,并赋予一个变量,然后以这个变量为文件名建立一个文件(比如29017.exe)

找了很多代码 都不行,特此来请教。。。。

谢谢。。。。。。。。。。
作者: garyng    时间: 2011-9-15 20:55

本帖最后由 garyng 于 2011-9-15 20:57 编辑

试试看这个:
它可以更短的~
  1. @echo off
  2. type AA.txt|find /i "SYS\SYS_" >>tmp.txt
  3. for /f "delims=\ tokens=6" %%i in ('type tmp.txt') do (
  4. for /f "delims=_ tokens=2" %%h in ('echo %%i') do (
  5. set a=%%h
  6. type nul>>%%h.exe
  7. )
  8. )
  9. del /q tmp.txt
  10. pause>nul
复制代码

作者: jackesy    时间: 2011-9-15 21:07

本帖最后由 jackesy 于 2011-9-15 21:14 编辑

回复 2# garyng


    太感谢了 可以了。  还能更短 更简单么。。。。请指教。。。

太多行符合 条件 都包含 SYS\SYS_  处理循环 太费时了,整个下来时间太长了。。。
作者: jackesy    时间: 2011-9-15 21:09

还有一个问题,就是 可能文件AA.TXT 比较大 ,半天才会结束。。。能一找到  字符串 就 停止么。。。应该时间的确有点长。。。
作者: garyng    时间: 2011-9-15 21:24

这个~
  1. @echo off
  2. type AA.txt|find /i "SYS\SYS_" >tmp.txt
  3. for /f "delims=\ tokens=6" %%i in ('type tmp.txt') do (
  4. for /f "delims=_ tokens=2" %%h in ('echo %%i') do (
  5.          set a=%%h
  6.          type nul>>%%h.exe
  7. )
  8. )
  9. del /q tmp.txt
  10. pause>nul
复制代码

作者: jackesy    时间: 2011-9-15 21:30

回复 5# garyng


    一样 还是循环半天,应该是 第一个循环 一直在循环,在第二个循环后加一个判断,,找到了 就 结束掉 或则跳出去。。。这样呢。。
作者: jackesy    时间: 2011-9-15 21:46

终于好了,非常感谢。。。
  1. @echo off
  2. type objList.txt|find /i "SYS\SYS_" >tmp.txt
  3. for /f "delims=\ tokens=6" %%i in ('type tmp.txt') do (
  4. for /f "delims=_ tokens=2" %%h in ('echo %%i') do (
  5.          set a=%%h
  6.          type nul>>%%h.exe
  7. echo %%h
  8. if %%i NEQ %%h goto :end
  9. )
  10. )
  11. :end
  12. del /q tmp.txt
  13. pause>nul
复制代码

作者: garyng    时间: 2011-9-15 22:12

这叫抛砖引玉~
作者: weichenxiehou    时间: 2011-9-16 00:06

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=6 delims=\" %%i in ('find /i "sys\sys_" aa.txt') do (
  3.   set str=%%i&set str=!str:*_=!
  4.   cd.>!str!.exe&goto :eof
  5. )
复制代码

作者: jackesy    时间: 2011-9-16 12:02

回复 8# garyng


    非常感谢。。。。


同时也谢谢楼上这位热心人。。。。。。。。
作者: zaixinxiangnian    时间: 2011-9-16 22:33

回复 5# garyng

请问你括号里面的 type 和 echo 是什么用意,,,没有它们不行吗?
作者: jackesy    时间: 2011-9-16 22:39

回复 11# zaixinxiangnian


    就是 把在文件里面查找到的字符串 显示出来,并在 FOR 语句里面作为 DO 后面的字符串 进行操作,,应该就这个意思吧。。呵呵 我菜鸟。。。。
作者: jackesy    时间: 2011-9-16 22:43

其实还有一个问题,我还在琢磨。因为上面的代码 都是窃取 第六个 节,一旦所要查找的字符串不在第六节 就没有办法了, 我上面也说了  只有查找的字符串是固定的,其他的都是可变的。。。

还需要继续加油啊 。。。
作者: weichenxiehou    时间: 2011-9-16 23:08

本帖最后由 weichenxiehou 于 2011-9-16 23:15 编辑

回复 13# jackesy
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('find /i "sys\sys_" aa.txt') do (
  3.   set "str=%%i"&set "str=!str:*sys\sys_=!"&set "str=!str:~,5!"
  4.   cd.>!str!.exe&goto :eof
  5. )
复制代码
其实还是很简单的,把找到的行从开始到sys\sys_的内容去掉,然后取5个字符就行了。
作者: jackesy    时间: 2011-9-16 23:14

回复 14# weichenxiehou


    这个看懂了,还有一个 小小问题 你的这个代码,怎么在 FOR 以外调用找到的 字符串。。我需要把找到的 赋予一个变量,可以再一个批处理任何地方 调用!!我的脑袋有点卡壳了。。
作者: jackesy    时间: 2011-9-16 23:17

看到 %%   !!  这些符号不晓得用哪一个,那些小符号 叫人头痛。。
作者: weichenxiehou    时间: 2011-9-16 23:23

回复 15# jackesy
不好意思,发现楼上代码有误,更正于此:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('findstr /i "sys\sys_" aa.txt') do (
  3.   set "str=%%i"&set "str=!str:*sys\sys_=!"&set "str=!str:~,5!"
  4.   cd.>!str!.exe&goto :eof
  5. )
复制代码

作者: weichenxiehou    时间: 2011-9-16 23:25

回复 15# jackesy
代码在for以内设置的变量,for结束后仍然可以对str这个变量进行调用啊。
作者: jackesy    时间: 2011-9-16 23:26

回复 14# weichenxiehou
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "skip=2 delims=" %%i in ('find /i "sys\sys_" aa.txt') do (
  3.   set "str=%%i"&set "str=!str:*sys\sys_=!"&set "str=!str:~,5!"
  4.   set NS=!str!&goto :end
  5. )
  6. :end
  7. echo %NS%
  8. goto :eof
复制代码
主要是 find /i "sys\sys_" aa.txt  出来的结果 第一排是---------------- aa.txt    必须跳过前面2排才是 真正查找到的内容  skip=2 ,,好了 解决了。。呵呵 。。。  

看看 还需要 修改的没有。。。。。。。。。。

感谢指导。。。。。。。。。。。。。
作者: weichenxiehou    时间: 2011-9-16 23:30

回复 19# jackesy
能找到别人代码的问题,就已经进步了,继续加油吧,不断学习。
作者: jackesy    时间: 2011-9-18 20:50

回复 17# weichenxiehou


    为什么你改成 findstr 后 反而什么字符串都找不到。。。。

    find /i "sys\sys_" aa.txt             这个可以找到很多包含sys\sys_的行      
    findstr /i "sys\sys_" aa.txt         这个却什么也找不到,很奇怪。。。

    他们有这么大的区别么。。。。。。。。。
作者: awk    时间: 2011-9-18 21:41

回复 21# jackesy


我这里4种写法都行
  1. findstr /i "sys\sys_" a.txt
  2. findstr /i "sys\\sys_" a.txt
  3. findstr /i /c:"sys\sys_" a.txt
  4. findstr /i /l "sys\sys_" a.txt
复制代码

作者: awk    时间: 2011-9-18 21:48

回复 1# jackesy
  1. gawk "/SYS\\SYS_/{gsub(/.*SYS\\SYS_/,\"\");gsub(/\\.*/,\"\"); print >$0\".txt\"}" a.txt
复制代码

作者: jackesy    时间: 2011-9-19 13:35

回复 22# awk


    你不信可以自己把一楼的代码存为A.TXT 试试,我执行后什么都没有找到。。不管是直接输出还是保存到另外一个文件都一样。。
作者: awk    时间: 2011-9-19 21:20

回复 24# jackesy


22楼发帖之前已经测试过了,可能是我们的操作系统不一样吧。
作者: jackesy    时间: 2011-9-20 13:30

回复 25# awk


    XP 系统不能用  findstr 么。。奇怪 我都能看到它 的  findstr /? 帮助呢。。。
作者: FOR    时间: 2011-10-4 21:55

  1. gawk "/SYS\\SYS_/{s=index($0,\"SYS\\SYS_\")+8;print substr($0,s,5)}" a.txt
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2