中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-11 01:48
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]文本中按行提取特定字符开头的字符串的问题。 查看 2,359 回复 21
楼 主 [已结]文本中按行提取特定字符开头的字符串的问题。 发表于 2008-12-14 16:54 ·  中国 广东 中山 联通
初级用户
积分 37
发帖 32
注册 2008-08-21 15:50
17年会员
UID 123784
性别 男
状态 离线
test.txt内容如下:

O41 - mfetdik - Anti-Virus Mini-Firewall Driver - c:\WINDOWS\system32\drivers\mfetdik.sys - (running) - Anti-Virus Mini-Firewall Driver - McAfee, Inc. - 64a3b2b683316b31b30c4622008810af
O41 - 1394hub - Generic - Host - Process for Win32 Services - C:\WINDOWS\system32\svchostdy.SYS - (running) - Generic Host Process for Win32 Services - Microsoft Corporation - a22d7b3594c381efb3395a072725fe95
O40 - svchost.exe - Microsoft Corporation - C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.3352_x-ww_81af8e88\gdiplus.dll - Microsoft GDI+ - e08307c7e813517470d1f9d705a7d5b2



测试文本大致为此种格式:
1每行有N段字符串,都使用“ - ”来分隔
2.路径的信息可能是其他后缀名的文件,文件路径可能含有“-”。
3.用“-”作为分隔符,含有路径的字符串是不确定在第几段的位置。
4.路径的有盘符为不确定是C,有可能是D\E\F…….

我想通过批处理,逐行分析提取从盘符开始直到扩展名结束的字符串(测试文本的红色部分),也就是不管什么方法提取每行中的文件的路径信息,因为其他段都是一些文件的属性参数和路径无关

小弟的水平,是在是想不出来一个完美点的批处理。

———————————————————————
感谢2楼的朋友,再次更新了问题!谢谢大家的回复和帮助!!
———————————————————————


[ Last edited by HAT on 2008-12-15 at 18:12 ]
2 发表于 2008-12-14 17:36 ·  中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@echo off & setlocal EnableDelayedExpansion
for /f %%a in (test.txt) do (
set str=%%a
for /f "delims=-" %%i in ("!str:*-xx=!") do echo xx%%i
)
pause
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
nanhezzb +1 2008-12-15 09:30
3 re 4 楼 发表于 2008-12-14 18:12 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%a in (test.txt) do (
set str=%%a
for /f "delims=- " %%i in ("!str:*C:=!") do echo C:%%i
)
pause
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
nanhezzb +1 2008-12-15 09:29
4 发表于 2008-12-15 10:54 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
撇开批处理不谈,你是如何用人工提取路径信息的呢?你把规律总结出来,自然有人告诉你如何写代码。
5 发表于 2008-12-15 12:06 ·  中国 广东 中山 联通
初级用户
积分 37
发帖 32
注册 2008-08-21 15:50
17年会员
UID 123784
性别 男
状态 离线
Originally posted by HAT at 2008-12-15 10:54 AM:
撇开批处理不谈,你是如何用人工提取路径信息的呢?你把规律总结出来,自然有人告诉你如何写代码。


人工的话,每行中从盘符(C、D或者其他)开始直到文件扩展名(.sys、.dll)结束。也就是文件的全路径,比如C:\WINDOWS\system32\drivers\XXXX.sys或者C:\WINDOWS\system32\XXXX.dll
想通过批处理,逐行分析提取从盘符开始直到扩展名结束的字符串(测试文本的红色部分),也就是不管什么方法提取每行中的文件的路径信息,因为其他段都是一些文件的属性参数和路径无关。

[ Last edited by nanhezzb on 2008-12-15 at 12:12 ]
6 发表于 2008-12-15 13:21 ·  中国 北京 鹏博士BGP
初级用户
积分 22
发帖 21
注册 2008-11-13 13:44
17年会员
UID 130844
性别 男
状态 离线
没有来得及细想,是否可以按照这个思路呢:
先按照" - "分隔符号把文本分成一个一个字段
然后提取包含:\的字段。
7 发表于 2008-12-15 13:25 ·  中国 北京 鹏博士BGP
初级用户
积分 22
发帖 21
注册 2008-11-13 13:44
17年会员
UID 130844
性别 男
状态 离线
建议用awk 或者grep
8 发表于 2008-12-15 13:32 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
空格-空格替换为某字符……

然后分割……

文件路径带" - "的话会出问题,不过个人认为大部分都不会除了歌曲那些东西
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
9 发表于 2008-12-15 13:43 ·  中国 上海 浦东新区 电信
初级用户
积分 71
发帖 34
注册 2007-12-20 23:57
18年会员
UID 106311
性别 男
状态 离线
按照8楼的思路写了个

@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%j in (test.txt) do (
set a=%%j
set a=!a: - =(!
call :loop
)
pause


:loop
for /f "tokens=1 delims=(" %%i in ("!a!") do (
set b=!a:~1,2!
if /i "!b!"==":\" echo %%i
)
set a=!a:*(=!
if !a!==!c! goto :eof
set c=!a!
goto :loop
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
nanhezzb +1 2008-12-15 14:30
10 发表于 2008-12-15 14:00 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
。。。少说了点……

先:分割……

前半部分set取最后一个字符得到Driver

后部分再按8楼走……
后面也可以一个个取。。。自己匹配吧
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
11 发表于 2008-12-15 14:32 ·  中国 广东 中山 联通
初级用户
积分 37
发帖 32
注册 2008-08-21 15:50
17年会员
UID 123784
性别 男
状态 离线
Originally posted by a794685135 at 2008-12-15 01:43 PM:
按照8楼的思路写了个

@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%j in (test.txt) do (
set a=%%j
set a=!a: - =(!
call :loop
)
pause


:loop
for /f "tokens=1 delims=(" %%i in ("!a!") do (
set b=!a:~1,2!
if /i "!b!"==":\" echo %%i
)
set a=!a:*(=!
if !a!==!c! goto :eof
set c=!a!
goto :loop


我试试了,好像是可以输出正确的结果的,谢谢了。不过我对里面的set a=!a: - =(!的参数不理解,等于左括号 在里面什么意思?
能详细的讲下含有a\b表达式的意思吗?

[ Last edited by nanhezzb on 2008-12-15 at 15:41 ]
12 发表于 2008-12-15 14:44 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%a in (test.txt) do (
set str=%%a
for /f "delims=" %%i in ("!str:*:=!") do set L=!str:%%i=!
for /f "delims=- " %%i in ("!str:*:=!") do echo !L:~-2!%%i
)
pause
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
nanhezzb +1 2008-12-15 15:15
13 发表于 2008-12-15 14:59 ·  中国 广东 中山 联通
初级用户
积分 37
发帖 32
注册 2008-08-21 15:50
17年会员
UID 123784
性别 男
状态 离线
Originally posted by tireless at 2008-12-15 02:44 PM:
@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%a in (test.txt) do (
set str=%%a
for /f "delims=" %%i in ("!str:*:=!") do set L=!str:%%i=!
for /f "delims=- " %%i in ("!str:*:=!") do echo !L:~-2!%%i
)
pause



这种先取:后面的段,然后添加前面的盘符。相比之下,对路径里面或者是其他段的空格或者是-的准确度比较高呢?

高手能不能讲下set的参数以及表达式意思

[ Last edited by nanhezzb on 2008-12-15 at 15:41 ]
14 Re 13楼 发表于 2008-12-15 15:02 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
先看帮助,后提问。
set /?
环境变量替换已如下增强:

%PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
15 发表于 2008-12-15 15:10 ·  中国 广东 中山 联通
初级用户
积分 37
发帖 32
注册 2008-08-21 15:50
17年会员
UID 123784
性别 男
状态 离线
Originally posted by HAT at 2008-12-15 03:02 PM:
先看帮助,后提问。
set /?
环境变量替换已如下增强:

%PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中 ...

帮助里面讲的太专业了,有些根本不理解,也没什么实际的例子。
论坛跳转: