标题: [文本处理] [已解决]批处理怎样查找特殊TXT文件的指定特殊字符后面的字符,并赋予一个变量? [打印本页]
作者: jackesy 时间: 2011-9-15 20:23 标题: [已解决]批处理怎样查找特殊TXT文件的指定特殊字符后面的字符,并赋予一个变量?
本帖最后由 jackesy 于 2011-9-16 13:45 编辑
请教,有这么一个txt文件AA.TXT,里面全部是 一下类似代码- 723fb954-d931-4348-b672-82a188e587b5.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\723fb954-d931-4348-b672-82a188e587b5.dsm|0|7|0
- 2fe0b7ef-4e24-4ab9-9c6e-e8b75791605e.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\2fe0b7ef-4e24-4ab9-9c6e-e8b75791605e.dsm|0|7|0
- f9d63b68-88f7-4a29-bd4a-014a3834c700.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\f9d63b68-88f7-4a29-bd4a-014a3834c700.dsm|0|7|0
- c1b932f5-431a-4774-9f12-5f9b6dcdd266.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\c1b932f5-431a-4774-9f12-5f9b6dcdd266.dsm|0|7|0
- 90cc9074-a3e8-4e1a-87e6-6f630422451d.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\90cc9074-a3e8-4e1a-87e6-6f630422451d.dsm|0|7|0
- ec0deea5-98fe-4ed8-80c8-8f04f3b5f300.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\ec0deea5-98fe-4ed8-80c8-8f04f3b5f300.dsm|0|7|0
- 010befdf-a6bd-4ec5-8ba5-9a4ab5c97219.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\010befdf-a6bd-4ec5-8ba5-9a4ab5c97219.dsm|0|7|0
- 18f34778-395e-4145-8357-7a038f60a34a.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\18f34778-395e-4145-8357-7a038f60a34a.dsm|0|7|0
- e7fc93e9-37b0-4333-92b5-6e07ffeeecfb.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\e7fc93e9-37b0-4333-92b5-6e07ffeeecfb.dsm|0|7|0
- 276fcdaf-8ebb-4ae1-832a-12aeb0f13c8a.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\276fcdaf-8ebb-4ae1-832a-12aeb0f13c8a.dsm|0|7|0
- e01f2da1-69cb-48f3-9826-301328c53c1d.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\e01f2da1-69cb-48f3-9826-301328c53c1d.dsm|0|7|0
- 0b2ca530-11a7-4f66-888f-f4428a3d1639.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\0b2ca530-11a7-4f66-888f-f4428a3d1639.dsm|0|7|0
- 4ce5a4c7-5e52-4e13-a58d-d165e618eb4e.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\4ce5a4c7-5e52-4e13-a58d-d165e618eb4e.dsm|0|7|0
- 1115a7db-611e-483d-bb16-978ea2a06d62.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\1115a7db-611e-483d-bb16-978ea2a06d62.dsm|0|7|0
- fefc7953-aa8e-44f6-ba1e-01f0f2712a1c.dsm|D:\G920\DIYRom\MYG920DIY\Temp\Dump\fefc7953-aa8e-44f6-ba1e-01f0f2712a1c.dsm|0|7|0
- simtkit.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\simtkit.dll|1|4|0
- simtkui.lnk|D:\G920\DIYRom\MYG920DIY\SYS\SYS_29017\SIM_TKit\simtkui.lnk|0|6|0
- simtkui.lnk=|D:\G920\DIYRom\MYG920DIY\SYS\SYS_29017\SIM_TKit\simtkui.lnk|0|6|0
- wince.nls|D:\G920\DIYRom\MYG920DIY\SYS\SYS_29017\WinCENLS_Lang_0804\wince.nls|0|6|0
- exsmime.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\exsmime.dll|1|4|0
- kbdus.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\kbdus.dll|1|6|0
- mstscax.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\mstscax.dll|1|4|0
- MvkLib.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\MvkLib.dll|1|4|0
- wpctsc.exe|D:\G920\DIYRom\MYG920DIY\Temp\Dump\wpctsc.exe|1|4|0
- wpctsc.lnk|D:\G920\DIYRom\MYG920DIY\SYS\SYS_29017\RemoteDesktopMobile\wpctsc.lnk|0|6|0
- Avrcp_MPplugin.dll|D:\G920\DIYRom\MYG920DIY\Temp\Dump\Avrcp_MPplugin.dll|1|4|0
- 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 编辑
试试看这个:
它可以更短的~- @echo off
- type AA.txt|find /i "SYS\SYS_" >>tmp.txt
- for /f "delims=\ tokens=6" %%i in ('type tmp.txt') do (
- for /f "delims=_ tokens=2" %%h in ('echo %%i') do (
- set a=%%h
- type nul>>%%h.exe
- )
- )
- del /q tmp.txt
- 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
这个~- @echo off
- type AA.txt|find /i "SYS\SYS_" >tmp.txt
- for /f "delims=\ tokens=6" %%i in ('type tmp.txt') do (
- for /f "delims=_ tokens=2" %%h in ('echo %%i') do (
- set a=%%h
- type nul>>%%h.exe
- )
- )
- del /q tmp.txt
- pause>nul
复制代码
作者: jackesy 时间: 2011-9-15 21:30
回复 5# garyng
一样 还是循环半天,应该是 第一个循环 一直在循环,在第二个循环后加一个判断,,找到了 就 结束掉 或则跳出去。。。这样呢。。
作者: jackesy 时间: 2011-9-15 21:46
终于好了,非常感谢。。。- @echo off
- type objList.txt|find /i "SYS\SYS_" >tmp.txt
- for /f "delims=\ tokens=6" %%i in ('type tmp.txt') do (
-
- for /f "delims=_ tokens=2" %%h in ('echo %%i') do (
- set a=%%h
- type nul>>%%h.exe
- echo %%h
- if %%i NEQ %%h goto :end
- )
- )
-
- :end
- del /q tmp.txt
- pause>nul
复制代码
作者: garyng 时间: 2011-9-15 22:12
这叫抛砖引玉~
作者: weichenxiehou 时间: 2011-9-16 00:06
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=6 delims=\" %%i in ('find /i "sys\sys_" aa.txt') do (
- set str=%%i&set str=!str:*_=!
- cd.>!str!.exe&goto :eof
- )
复制代码
作者: 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 - @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('find /i "sys\sys_" aa.txt') do (
- set "str=%%i"&set "str=!str:*sys\sys_=!"&set "str=!str:~,5!"
- cd.>!str!.exe&goto :eof
- )
复制代码
其实还是很简单的,把找到的行从开始到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
不好意思,发现楼上代码有误,更正于此:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('findstr /i "sys\sys_" aa.txt') do (
- set "str=%%i"&set "str=!str:*sys\sys_=!"&set "str=!str:~,5!"
- cd.>!str!.exe&goto :eof
- )
复制代码
作者: weichenxiehou 时间: 2011-9-16 23:25
回复 15# jackesy
代码在for以内设置的变量,for结束后仍然可以对str这个变量进行调用啊。
作者: jackesy 时间: 2011-9-16 23:26
回复 14# weichenxiehou - @echo off&setlocal enabledelayedexpansion
-
- for /f "skip=2 delims=" %%i in ('find /i "sys\sys_" aa.txt') do (
- set "str=%%i"&set "str=!str:*sys\sys_=!"&set "str=!str:~,5!"
- set NS=!str!&goto :end
- )
- :end
- echo %NS%
- 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种写法都行- findstr /i "sys\sys_" a.txt
- findstr /i "sys\\sys_" a.txt
- findstr /i /c:"sys\sys_" a.txt
- findstr /i /l "sys\sys_" a.txt
复制代码
作者: awk 时间: 2011-9-18 21:48
回复 1# jackesy - 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
- gawk "/SYS\\SYS_/{s=index($0,\"SYS\\SYS_\")+8;print substr($0,s,5)}" a.txt
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |