标题: [文本处理] 批处理怎样筛选用dir命令列出的文件目录的?请详细看问题的关健。 [打印本页]
作者: ilovebath 时间: 2011-11-16 14:33 标题: 批处理怎样筛选用dir命令列出的文件目录的?请详细看问题的关健。
本帖最后由 ilovebath 于 2011-11-21 10:31 编辑
用dir命令列出的文件目录的筛选
这个问题的关健是:我已经用dir命令列出了一个a.txt的文件,我现在是想在这一个a.txt文件里,找到我想到的,并不是重新在磁盘里找文件。这是关健。...............................
比如:
dir /s命令列出的目录和文件 a.txt 如下:
Directory of c:\
2011-11-10 09:46 <DIR> 360Rec
2011-09-23 13:09 0 AUTOEXEC.BAT
2011-11-10 17:16 0 COMLOG.txt
2011-09-23 13:09 0 CONFIG.SYS
2011-09-23 13:16 <DIR> Documents and Settings
2011-11-11 16:21 <DIR> Program Files
2011-11-11 11:20 <DIR> WINDOWS
Directory of C:\Perl\html\lib\Attribute
2011-09-25 22:03 <DIR> .
2011-09-25 22:03 <DIR> ..
2011-09-25 22:03 60,993 COMLOG.txt
1 File(s) 60,993 bytes
Directory of C:\Perl\html\lib\COMLOG
2011-09-25 22:03 <DIR> .
2011-09-25 22:03 <DIR> ..
2011-09-25 22:03 60,993 xxae.txt
1 File(s) 60,993 bytes
我想得到的结果是a.txt中,包含有comlog的字符,配置为*comlog*的文件,包含目录,写入到新文件里,并且最后的形式为:
c:\COMLOG.txt
C:\Perl\html\lib\Attribute\COMLOG.txt
C:\Perl\html\lib\COMLOG
一行一个,包含目录
作者: 小胖狐狸 时间: 2011-11-16 16:27
本帖最后由 小胖狐狸 于 2011-11-17 15:52 编辑
- @echo off
- dir /S /B|findstr /i "comlog">b.txt
- type b.txt
- pause
复制代码
作者: ilovebath 时间: 2011-11-16 17:17
回复 2# 小胖狐狸
失败。
作者: cutebe 时间: 2011-11-16 17:32
dir/s/a/b c:\*comlog*.*>a.txt
作者: ilovebath 时间: 2011-11-16 21:32
回复 4# cutebe
失败
作者: 小胖狐狸 时间: 2011-11-17 15:49
回复 小胖狐狸
失败。
ilovebath 发表于 2011-11-16 17:17
你不会是要求我在findstr 后面再帮你加个不区分大小写的 /I 参数吧,你自己不知道把我代码里的小写换成大写么?
怎么个失败法?
作者: ilovebath 时间: 2011-11-17 16:05
回复 6# 小胖狐狸
请你测试后再写代码行吗?
你不知道dir /s列出的a.txt本来就乱七八糟,这样根本在a.txt这个大文件里,找不到任何字符的。
作者: CrLf 时间: 2011-11-17 16:07
回复 5# ilovebath
看病只说一句“我难受”,有哪个神医能治好你的病?
作者: wc726842270 时间: 2011-11-17 16:40
个人解决此问题都是用WIMC或者FOR的
作者: Hello123World 时间: 2011-11-18 13:54
本帖最后由 Hello123World 于 2011-11-18 13:59 编辑
- @echo off
- (For /f "delims=" %%i in ('dir /s /b /a *.* ^|Findstr /i "comlog"') do echo %%~fi)>a.txt
- start a.txt
复制代码
dir /s /b /a *.* |Findstr /i "comlog">a.txt
弄复杂了,这样就可以。
作者: ilovebath 时间: 2011-11-21 10:32
回复 10# Hello123World
请看此问题的关健。谢谢
作者: 小胖狐狸 时间: 2011-11-24 10:35
本帖最后由 小胖狐狸 于 2011-11-24 10:43 编辑
回复 小胖狐狸
请你测试后再写代码行吗?
你不知道dir /s列出的a.txt本来就乱七八糟,这样根本 ...
ilovebath 发表于 2011-11-17 16:05
请问你仔细看了我的代码吗?请问你测试了我写的代码吗? 我写的不是只有 /s 一个参数,我还加了一个 /B 参数,这样列出来的a.txt还乱?请测试后在说话
刚看到你后来补充的所谓的问题的关键,这是人为制造麻烦然后要求别人来解决,我没兴趣也没能力解答这种劳民伤财、毫无意义的问题
你用 dir /S /B 导出的a.txt好处理得多,为什么非得要用dir /S 来导出一个不好处理的文件来要求别人帮你解决呢?
这个问题的关健是:我已经用dir命令列出了一个a.txt的文件,我现在是想在这一个a.txt文件里,找到我想到的,并不是重新在磁盘里找文件。这是关健。...............................
作者: ilovebath 时间: 2011-12-1 10:26
回复 12# 小胖狐狸
终于有人懂我的意思了,谢谢你。仍然感谢你。哈哈。
作者: HAT 时间: 2011-12-1 10:50
回复 12# 小胖狐狸
赞同!
确实搞不清楚那伙人怎么想的。
你告诉他从北京到广州可以坐火车走京广线,他非要问徒步过去的话怎样游过黄河、翻越秦岭。
作者: slore 时间: 2011-12-1 11:52
本帖最后由 slore 于 2011-12-1 11:55 编辑
回复 12# 小胖狐狸
这种需求也是可能有的吧,不一定是自己制造麻烦。
1.别的计算机导出列表(现在无法去在那个计算机上执行dir /S /B)
2.采集时点不同。
即使是本机,这些文件删除了等等原因,现在再DIR一次结果无法重现。
3.即使按你想的那样,最好用正则筛选 .*关键字.*$ ,关键字结尾的行筛出来。
避免
C:\关键字\1.txt
C:\关键字\1\haha.txt
把子文件及子目录全列出来啦。
回复楼主:
本人表示这个很简单。
一看题目能想到有2种方案,其实本质是一种。
逻辑代码就10行左右。
方案1:
1.用findstr筛选出目录名和包含关键字的文件名的行
2.剩下用方案2(除取紫色文字表示的逻辑)
方案2:
for 读取文件{
if 是Dir开头表示文件夹
取出目录路径保存至 当前目录
else /*是文件名*/
取出文件名,和关键字比较OK的话,和 当前目录 拼接 输出(
}
方案1的好处是用findstr来过滤,可能效率比自己for高些。。。能把大部分无用数据清除掉。
逻辑上是一样的。
以1楼的数据为例(稍微改了下,为什么改你们应该明白):
-----------------------------------------------------------------------
Directory of c:\
2011-11-10 09:46 <DIR> 360Rec
2011-09-23 13:09 0 AUTOEXEC.BAT
2011-11-10 17:16 0 COMLOG.txt
2011-09-23 13:09 0 CONFIG.SYS
2011-09-23 13:09 0 Directory
2011-09-23 13:16 <DIR> Documents and Settings
2011-11-11 16:21 <DIR> Program Files
2011-11-11 11:20 <DIR> WINDOWS
Directory of C:\Perl\html\lib\Attribute
2011-09-25 22:03 <DIR> .
2011-09-25 22:03 <DIR> ..
2011-09-25 22:03 60,993 COMLOG.txt
1 File(s) 60,993 bytes
Directory of C:\Perl\html\lib
2011-11-11 11:20 <DIR> COMLOG
Directory of C:\Perl\html\lib\COMLOG
2011-09-25 22:03 <DIR> .
2011-09-25 22:03 <DIR> ..
2011-09-25 22:03 60,993 xxae.txt
1 File(s) 60,993 bytes
------------------------------------------------------------------------
findstr /r /i "^Directory .*comlog.*$" c:\a.txt
输出结果:- Directory of c:\
- 2011-11-10 17:16 0 COMLOG.txt
- Directory of C:\Perl\html\lib\Attribute
- 2011-09-25 22:03 60,993 COMLOG.txt
- Directory of C:\Perl\html\lib
- 2011-11-11 11:20 <DIR> COMLOG
- Directory of C:\Perl\html\lib\COMLOG
复制代码
作者: powerbat 时间: 2011-12-1 12:14
有点像南辕北辙。。
仍然借助于方便的JS(JavaScript)- @set @n=0//&cscript.exe -nologo -e:jscript "%~f0"&pause&exit/b
-
- file = "a.txt";
-
- fso = new ActiveXObject("Scripting.FileSystemObject");
- s = fso.OpenTextFile(file).ReadAll();
- result = '';
- dir = '';
- s.replace(/^Directory of (.+)|^\d+-\d+-\d+ +\d+:\d+ +\d+(?:,\d+)* (.*?comlog.*)/gim,
- function(s0,s1,s2){
- if (s1) {
- dir = s1.slice(0,-1);
- if (/comlog[^\\]*$/i.test(s1)) result += s1;
- } else result += dir+'\\'+s2;
- });
- result = result.replace(/\r/g,'\r\n').replace(/\\\\/g,'\\');
- WScript.Echo(result);
复制代码
作者: ilovebath 时间: 2012-11-10 14:51
谢谢楼上。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |