Board logo

标题: [文本处理] 批处理怎样筛选用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 编辑
  1. @echo off
  2. dir /S /B|findstr /i "comlog">b.txt
  3. type b.txt
  4. 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 编辑
  1. @echo off
  2. (For /f "delims=" %%i in ('dir /s /b /a *.* ^|Findstr /i "comlog"') do echo %%~fi)>a.txt
  3. 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
输出结果:
  1. Directory of c:\
  2. 2011-11-10  17:16                 0 COMLOG.txt
  3. Directory of C:\Perl\html\lib\Attribute
  4. 2011-09-25  22:03            60,993 COMLOG.txt
  5. Directory of C:\Perl\html\lib
  6. 2011-11-11  11:20    <DIR>          COMLOG
  7. Directory of C:\Perl\html\lib\COMLOG
复制代码

作者: powerbat    时间: 2011-12-1 12:14

有点像南辕北辙。。

仍然借助于方便的JS(JavaScript)
  1. @set @n=0//&cscript.exe -nologo -e:jscript "%~f0"&pause&exit/b
  2. file = "a.txt";
  3. fso = new ActiveXObject("Scripting.FileSystemObject");
  4. s = fso.OpenTextFile(file).ReadAll();
  5. result = '';
  6. dir = '';
  7. s.replace(/^Directory of (.+)|^\d+-\d+-\d+ +\d+:\d+ +\d+(?:,\d+)* (.*?comlog.*)/gim,
  8.     function(s0,s1,s2){
  9.         if (s1) {
  10.             dir = s1.slice(0,-1);
  11.             if (/comlog[^\\]*$/i.test(s1)) result += s1;
  12.         } else result += dir+'\\'+s2;
  13.     });
  14. result = result.replace(/\r/g,'\r\n').replace(/\\\\/g,'\\');
  15. WScript.Echo(result);
复制代码

作者: ilovebath    时间: 2012-11-10 14:51

谢谢楼上。




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