调用Dos中的Dir命令遍历目标文件夹内所有文件、以及所有子文件夹中的所有文件
调用Dos中的Dir命令
Sub ListFilesDos()
Set myFolder = CreateObject("Shell.Application").BrowseForFolder(0, "GetFolder", 0)
If Not myFolder Is Nothing Then myPath$ = myFolder.Items.Item.Path Else MsgBox "Folder not Selected": Exit Sub
myFile$ = InputBox("Filename", "Find File", ".xl")
'在这里输入需要指定的关键字,可以是文件名的一部分,或指定文件类型如 ".xl"
tms = Timer
With CreateObject("Wscript.Shell") 'VBA调用Dos命令
ar = Split(.exec("cmd /c dir /a-d /b /s " & Chr(34) & myPath & Chr(34)).StdOut.ReadAll, vbCrLf) '所有文档含子文件夹
'指定Dos中Dir命令的开关然后提取结果 为指定文件夹以及所含子文件夹内的所有文件的含路径全名。
s = "from " & UBound(ar) & " Files by Search time: " & Format(Timer - tms, " 0.00s") & " in: " & myPath
'记录Dos中执行Dir命令的耗时
tms = Timer: ar = Filter(ar, myFile) '然后开始按指定关键词进行筛选。可筛选文件名或文件类型
Application.StatusBar = Format(Timer - tms, "0.00s") & " Find " & UBound(ar) + IIf(myFile = "", 0, 1) & " Files " & s
'在Excel状态栏上显示执行结果以及耗时
End With
[a:a] = "": If UBound(ar) > -1 Then [a2].Resize(1 + UBound(ar)) = WorksheetFunction.Transpose(ar)
'清空A列,然后输出结果
End Sub
————————————————
关于Dos中Dir命令的开关问题:
【提取文档】
.Exec("cmd /c dir /a-d /b " ………Dir返回指定文件夹下【不包括子文件夹】的所有文档名(不含文件夹)
.Exec("cmd /c dir /a-d /b /s " ………Dir返回指定文件夹下【包括子文件夹】在内的所有文档名(不含文件夹)其中, /s 即 是否包含 SubFolder的意思
而 /a-d 是文件对象中排除文件夹目录(-d)只剩下文档的意思。【提取文件夹】
.Exec("cmd /c dir /a-a /b " ………Dir返回指定文件夹下【不包括子文件夹】内的所有子文件夹名(不含文档)
.Exec("cmd /c dir /a-a /b /s " ………Dir返回指定文件夹下【包括子文件夹】内的所有子文件夹名(不含文档)
而 /a-a 是文件对象中排除文档(-a)只剩下文件夹目录的意思。【提取文档和文件夹】
.Exec("cmd /c dir /b " ………Dir返回指定文件夹下【不包括子文件夹】的所有【文档名】和【文件夹名】
.Exec("cmd /c dir /b /s " ………Dir返回指定文件夹下【包括子文件夹】的所有【文档名】和【文件夹名】呵呵,以上6种的开关组合就足够了。
补充:Dos 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 用四位数字显示年可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。