ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 13409|回复: 13

[分享] Dos命令学习分享(一、Find及Findstr)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-12-24 15:58 | 显示全部楼层 |阅读模式
学习要点:
1.字符串查找:find
2.字符串查找增强:findstr
------------------------------------------------------------------------------------------------------


一.字符串查找:find

在文件中搜索字符串。
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V        显示所有未包含指定字符串的行。
  /C        仅显示包含字符串的行数。
  /N        显示行号。
  /I        搜索字符串时忽略大小写。
  /OFF[LINE] 不要跳过具有脱机属性集的文件。
  "string"   指定要搜索的文字串,
  [drive:][path]filename   指定要搜索的文件。
------------------------------------------------------------------------------------------------------

基本格式:find "要查找的字符串" 要查找的文件(不在当前目录则需要给出完整路径)

例1
find "abc" d:\abc.txt
在abc.txt中查找字符串abc的行。
------------------------------------------------------------------------------------------------------

/I 搜索字符串时忽略大小写。

例2
find /i "abc" d:\abc.txt
参数/i代表的是“Ignore”(忽略),也就是忽略大小写。通过/I 参数可以不区分要查找的字符串“abc”的大小写。
------------------------------------------------------------------------------------------------------

/N 显示行号。

例3
find /n "abc" d:\abc.txt
参数/n代表英语单词“Number”(号码).。通过/n参数我们可以查找到字符串"abc"所在的行号。
------------------------------------------------------------------------------------------------------

/C 仅显示包含字符串的行数。

例4
find /c "abc" d:\abc.txt
参数/c是英语单词“Count”(计数)的缩写。通过/c参数我们可以统计包含"abc"字符串的行数。
------------------------------------------------------------------------------------------------------

/V  显示所有未包含指定字符串的行。

例5
find /v "abc" d:\abc.txt
这个参数用于找出文件中不包含指定字符串的行。在这里表示查找不包含"abc"字符串的行。

注意:find命令中要查找的字符串一字要用双引号" "括起来。
------------------------------------------------------------------------------------------------------




二.字符串查找增强:findstr

在文件中寻找字符串。
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。
  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索
              匹配文件。
  /I         指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
  /O        在每个匹配行前打印字符偏移量。
  /P        忽略有不可打印字符的文件。
  /OFF[LINE] 不跳过带有脱机属性集的文件。
  /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file   从指定文件读文件列表 (/ 代表控制台)。
  /C:string 使用指定字符串作为文字搜索字符串。
  /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir    查找以分号为分隔符的目录列表
  strings   要查找的文字。
  [drive:][path]filename  指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there" 。  'FINDSTR /C:"hello there" x.y' 在文件 x.y 寻找 "hello there"。
------------------------------------------------------------------------------------------------------

1.基本格式:findstr " strings " [drive:][path]filename

Strings  是要查找的内容。
[rive:][path]filename  指定要查找的文件,路径可缺省,缺省情况下为当前目录。

例1
findstr "icq" 123.txt
在123.txt中查找包含有“icq”这三个字符串的行。
------------------------------------------------------------------------------------------------------

/I  指定搜索不分大小写。

例2
findstr /i "MSN" 123.txt
在123.txt中查找包含有“MSN”这三个字符的行,且不区分大小写。
------------------------------------------------------------------------------------------------------

★/R 将搜索字符串作为正则表达式使用。参数/R 强调以正则表达式规则来解读字符串。R - Right 右即为正。我们
都说右手是正手,因此引申为右为正,左为反。

例3
findstr /r "icq msn" 123.txt
在123.txt中查找包含有 “icq”或“msn”的行,查找的多个字符串间用空格隔格开。
------------------------------------------------------------------------------------------------------

/S 在当前目录和所有子目录中搜索。

例4
findstr /s /i "MSN" *.txt
在当前目录和所有子目录中的txt文件中搜索字符串"MSN"(不区分字母大小写)。
------------------------------------------------------------------------------------------------------

/C:string 使用指定字符串作为文字搜索字符串。

例5
findstr /c:"icq msn" 123.txt
在123.txt中查找包含有 “icq msn”这几个字符的行。注意,这里“icq msn”是一整体的。
此参数多用于查找含有空格的字符串。
------------------------------------------------------------------------------------------------------

★在使用 findstr "我 你 他" test.txt 的时候,并不能查找到内容,但是,加上开关 /i 或者 /r 之后就正确无误
了,可能是在查找多个纯中文字符串的时候的一个bug吧;单个的纯中文字符串没有任何问题。
------------------------------------------------------------------------------------------------------


2.findstr 命令中正则表达式的用法规则

一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类别: 任何在字符集中的字符
  [^class] 补字符类别: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  \x       Escape: 元字符 x 的文字用法
  \<xyz    字位置: 字的开始
  xyz\>    字位置: 字的结束
------------------------------------------------------------------------------------------------------

● 通配符和重复符规则,即 . 和 *
通配符,即一个句点,代表任何一个字符,而且只能是一个,包括字母、数字、半角符号还有空格。
重复符,即型号* 代表前面字母的出现次数(出现次数从0到多次,0表示没有)。

findstr . 123.txt 或 findstr "." 123.txt
在文件123.txt中查找任意字符,不包括空行。

例6
findstr .* 2.txt 或 findstr ".*" 2.txt
在文件123.txt中查找任意字符,包括空行。

例7
findstr ac* 123.txt
在文件123.txt中查找出现一个“a”字符串,以及a后面出现过0次或者任意次c的字符行。
如:
a
ac
acc
addc
等都匹配。

例8
findstr ak5* 123.txt
在文件123.txt中查找出现一个“ak”字符串,以及ak后面出现过0次或者任意次5的字符行。如:
ak
ak5
akbbb
ak125
ak555
等都匹配。
------------------------------------------------------------------------------------------------------

●行首、行尾符规则,即 ^ 和 $

例9
findstr "^step" 123.txt
在文件123.txt中查找行首为step字符串的行。
如:
stepkdka
step 456
这两行都匹配的。

例10
findstr "step$" 123.txt
在文件123.txt中查找行尾为step字符串的行。
如:
123 dstep
123step
这两行也匹配的。

例11
findstr "^step$" 123.txt
在文件123.txt中查找行首为step,且行尾也为step的行,即step独自一行。
------------------------------------------------------------------------------------------------------

● 字符集规则,即[class]
①表示含有集里的任意一个字符的即匹配。
②该字符集里的元素可以是字母和数字和一般的半角字符,如:}{ ,.][等,但双引号"不被识别。不能是汉字, 汉字
不被正确解释(汉字不是ASCII码)。
如果在字符集内插入通配符和重复符号,即"[.*]"将会把. 和 *视为普通字符,没有通配和重复的含义。

例12
findstr "[0-9]" 123.txt
在文件123.txt中查找数字0-9的任意之一的行。
如:
4kkb
1 lkka cc
这两行都匹配。

例13
findstr "[a-zA-Z]" 123.txt
在文件123.txt中查找包括任意字母行。

例14
findstr "[abcezy]" 2.txt
在文件123.txt中查找包括a b c e z y其中任意一字母的行。

例15
findstr "[a-fl-z]" 2.txt
在文件123.txt中查找小写字符a到f 或l到z的任意一字母的行,但不包含g h I j k这几个字母。

例16
findstr "M[abc][123]Y" 2.txt
在文件123.txt中查找可以匹配 Ma1Y , Mb1Y, Mc1Y; Ma2Y , Mb2Y, Mc2Y; Ma3Y , Mb3Y, Mc3Y的行。
------------------------------------------------------------------------------------------------------

● 减法规则,即[^class]

例17
findstr "[^0-9]" 123.txt
如果是纯数字的行便过滤掉,例如2323423423 这样的字符串被过滤,345hh888这样的形式则过滤不了。
注意,纯数字的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!

例18
findstr "[^a-z]" 123.txt
如果是纯字母的行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf 这样的字符将被过滤,如果是sdfksjdkf99999这样的形
式则过滤不了。
注意,纯字母的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!

例19
findstr "[^add]" 123.txt
过滤仅含有由a d d三个字母组成的纯字母字符串的行。
如:
a
ad
ddaadd
dd
这些行都会被过滤。
注意,仅含有由a d d三个字母组成的纯字母字符串的行不能有空格,不论行首行尾或者是行中都不能有空格,否则
过滤失败!

例20
findstr "[^echo]" 123.txt
过滤仅含有由e  c  h  o 四个字母组成的纯字母字符串的行。
如:
e
c
ec
cho
chooo
这些行都会被过滤。
------------------------------------------------------------------------------------------------------

●单词前缀后缀定位规则,即\<xyz和xyz\>

该xyz可以是英文单词或数字,但不适用于汉字。符号 \ 理解为转义符,化解小于号和大于号的重定向命令含义。
该规则是匹配类似单个英文单词的。

例21
findstr "\<echo" 123.txt
所有含有以echo为前缀的字符串的行,都匹配。
如:
echo:kkk a add
jjkk echo
这两行都匹配。
(思考:为什么:echo也匹配?)

例22
findstr "echo\>" 123.txt
所有含有以echo为后缀的字符串的行,都匹配。
如:
qq bbecho 这一行也匹配。
(思考:为什么kkkk echo:也匹配?)

例23
findstr "\<end\>123.txt
这里是用来精确查找单词。查找单词end的行,
注意:
ended
cdkend
bcd-end-jjkk
这类词都不匹配。
(思考:为什么end echo和end也匹配?因为\<xyz\>格式要查找的是单个英文单词。)
------------------------------------------------------------------------------------------------------

● 转义符 \
把表达式中的特殊字符(元字符)转化为普通字符。常见写法:
\.
\*
\\
\[
\]??
\-

例24
findstr "\.abc" 123.txt
在文件123.txt中查找可以匹配“.abc”字符串的行,这里\。是把。给转义了。

例25
findstr "1\\" 123.txt 或findstr "1\\\\" 123.txt
在文件123.txt中查找可以匹配“1\”字符串的行,这里\\是把\给转义了。

★要查找的字符串含有\时,可以用\\把\给转义;或者把\变成\\\\。如果目标字符串的\后面还有内容,则搜索字符
串\除了要变成\\(本身的转义要求),还可以在它后面再加一个字符,如\\.
------------------------------------------------------------------------------------------------------

当我看到正则二字,甚为激动
好东西定要分享,呵呵
附上自己测试用的代码,仅供参考
  1. '利用find命令的时候,不仅在最后会产生一个换行,前面的摘要信息也会对
  2. '最终取得到的数组有影响,暂时采用的方法是:
  3. '=============================================
  4. '   【通过一次循环,截掉前两个数组元素和最后一个数组元素】
  5. '=============================================

  6. Sub find搜索文本()
  7.     '定义临时数组及最终结果数组
  8.     Dim strArr, strBrr() As String
  9.      '定义需要查找的文本路径、dos命令返回的字符串及Find查找命令
  10.     Dim strPath As String, strAll As String, strFind As String
  11.     '定义strBrr数组大小变量及循环变量
  12.     Dim arrN As Long, i As Long
  13.     '定义Shell对象
  14.     Dim objShell As Object
  15.     '定义Exec对象
  16.     Dim dosExec As Object
  17.     strPath = "d:\abc.txt"    '需要find的文件路径
  18.     strFind = "find /N " & Chr(34) & "abc" & Chr(34)    '存储find命令
  19.     strFind = "cmd.exe /c " & strFind & " d:\abc.txt"
  20.     Set objShell = CreateObject("WScript.Shell")
  21.     Set dosExec = objShell.Exec(strFind)
  22.     strAll = dosExec.StdOut.ReadAll
  23.     strArr = Split(strAll, vbCrLf)
  24.     arrN = UBound(strArr) + 1
  25.     ReDim strBrr(1 To arrN - 3)
  26.     For i = 2 To arrN - 2
  27.         strBrr(i - 1) = strArr(i)
  28.     Next
  29.     Set objShell = Nothing: Set dosExec = Nothing
  30.     Stop
  31. End Sub
复制代码

[ 本帖最后由 赵国辉 于 2009-12-24 16:00 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-24 16:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

二、Dir命令的使用

dir

显示目录中的文件和子目录列表。
DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
    [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

    [drive:][path][filename]   指定要列出的驱动器、目录和/或文件。

  /A          显示具有指定属性的文件。
  attributes   D  目录                R  只读文件
               H  隐藏文件            A  准备存档的文件
               S  系统文件            -  表示“否”的前缀
  /B          使用空格式(没有标题信息或摘要)。
  /C          在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
              停用分隔符显示。
  /D          跟宽式相同,但文件是按栏分类列出的。
  /L          用小写。
  /N          新的长列表格式,其中文件名在最右边。
  /O          用分类顺序列出文件。
  sortorder    N  按名称(字母顺序)     S  按大小(从小到大)
               E  按扩展名(字母顺序)   D  按日期/时间(从先到后)
               G  组目录优先           -  颠倒顺序的前缀
  /P          在每个信息屏幕后暂停。
  /Q          显示文件所有者。
  /S          显示指定目录和所有子目录中的文件。
  /T          控制显示或用来分类的时间字符域。
  timefield   C  创建时间
              A  上次访问时间
              W  上次写入的时间
  /W          用宽列表格式。
  /X          显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,
              短名称插在长名称前面。如果没有短名称,在其位置则
              显示空白。
  /4          用四位数字显示年

------------------------------------------------------------------------------------------------------

  关于dir命令比较多,看到上面一大堆的参数头都晕了,呵呵~   在这里我们学习一些常用的就OK了~

1。列出c:\windows下的目录及文件
格式:DIR [drive:][path][filename]

例1
dir c:\windows
  这种方法有明显的缺点——当列表中的目录及文件过多时就无法完全显示,我们将通过/p参数解决这个问题。


/P 在每个信息屏幕后暂停。
例2
dir /p c:\windows
  我们在命令最后加上一个参数“/p”(即“page”页的缩写),列文件时就会使用分页显示的方式,即列出一屏的目
录及文件后,提示“按任意键继续...”,按任意键后则显示下一屏。这样就可以逐屏查看了!


/B 使用空格式(没有标题信息或摘要)。
例3
dir /b c:\
我们在查看时,发现列出来的文件都带有日期,时间,创建者等信息,我们可以在命令后加上/b参数,让它只列出文
件名称。
------------------------------------------------------------------------------------------------------


2。列出c:\下指定属性的文件
格式:DIR /a: attributes (这里的:号可以省略)
  attributes   D  目录                R  只读文件
               H  隐藏文件            A  准备存档的文件
               S  系统文件            -  表示“否”的前缀

例1
dir /a c:\
列出C:\下所有的文件。

例2
dir /ah c:\
列出隐含的文件(包含文件和文件夹)。

例3
dir /ad c:\
列出C:\下所有的文件夹。

例4
dir /ad-h c:\
列出C:\下所有的文件夹,但不包含隐含的文件夹。
------------------------------------------------------------------------------------------------------


3。按分类列出c:\下的文件
格式:DIR /o: sortorder (这里的:号可以省略)
  sortorder    N  按名称(字母顺序)     S  按大小(从小到大)
               E  按扩展名(字母顺序)   D  按日期/时间(从先到后)
               G  组目录优先           -  颠倒顺序的前缀

例1
dir /on c:\
/o:排序方式 参数指定了dir命令显示命令结果时的排序方式,排序方式设为“n”即代表按照文件名的字母顺序排列
(从A~Z,以此类推)。

例2
dir /ogn c:\
优先列出文件夹,并且文件夹和文件都按字母顺序排列。

  ★“/o”和“/a”都可以省略其后的冒号“:”,但之间不能留有空格。如“/o:n”省略后的形
式应为“/on”。

附上以前回复的一小段代码
  1. Sub Dir获取某路径下文件列表()
  2.     Dim strArr
  3.     Dim strPath As String, strAll As String
  4.     strPath = "d:\a\*.xls /s"
  5.     Dim objShell As Object
  6.     Dim dosExec As Object
  7.     Set objShell = CreateObject("WScript.Shell")
  8.     Set dosExec = objShell.Exec("cmd.exe /c dir /B " & strPath)
  9.     strAll = dosExec.StdOut.ReadAll
  10.     strAll = Left(strAll, Len(strAll) - 1) '去掉最后一个换行
  11.     strArr = Split(strAll, vbCrLf)
  12.     Stop
  13.     Set objShell = Nothing: Set dosExec = Nothing
  14. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-24 16:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
占位,呵呵

TA的精华主题

TA的得分主题

发表于 2009-12-24 16:08 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-24 16:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-12-24 19:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-4-25 15:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
先收藏了再说!{:soso_e100:}

TA的精华主题

TA的得分主题

发表于 2012-7-31 16:25 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-4-23 14:35 | 显示全部楼层
感谢楼主,这个调用dos命令的方法很实用呀,帮我解决了大问题了

TA的精华主题

TA的得分主题

发表于 2013-4-25 09:44 | 显示全部楼层
请问老师,dir得到结果如何知道具体的文件个数
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-8 09:16 , Processed in 0.048349 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表