Board logo

标题: [问题求助] vbs如何实现输出指定路径/目录/文件夹下所有子文件夹及文件的路径 [打印本页]

作者: ghost-jason    时间: 2014-10-24 18:55     标题: vbs如何实现输出指定路径/目录/文件夹下所有子文件夹及文件的路径

本帖最后由 pcl_test 于 2016-9-3 15:37 编辑

如果哪位大神牛的话顺便把文件夹下有哪些东西显示出来。文件夹下存放的东西,子文件夹下存放的东西。小弟只当学习。大神就当重新温习温习。谢谢啦!!!
作者: DAIC    时间: 2014-10-24 19:21

  1. Dim objShell
  2. Set objShell = CreateObject("WSCript.Shell")
  3. objShell.Run "cmd /k dir D:\"
  4. Set objShell = Nothing
复制代码
Dim objShell
Set objShell = CreateObject("WSCript.Shell")
objShell.Run "cmd /k dir /s D:\"
Set objShell = Nothing
作者: ghost-jason    时间: 2014-10-26 20:31

回复 2# DAIC


    谢啦。不要bat的。能不能用vbs代码写。遍历的那种
作者: DAIC    时间: 2014-10-27 12:30

回复 3# ghost-jason


    把2楼代码保存为test.vbs,执行的时候报错了吗?
作者: ghost-jason    时间: 2014-10-27 19:24

回复 4# DAIC

报错了
能不能写个纯vbs脚本的,谢啦
作者: DAIC    时间: 2014-10-27 20:26

回复 5# ghost-jason


    你的D盘是不是光驱?
作者: ghost-jason    时间: 2014-10-28 11:30

回复 6# DAIC


    恩恩。是了。我换了个盘。能行。但是我不想用bat。比如d盘下有一个文件夹test而这个test文件夹下还有一个文件夹test1就是d:\test\test1\test2等等
就是这种效果
作者: yu2n    时间: 2014-10-29 11:59

给你个……
  1. ' +----------------------------------------------------------------------------+
  2. ' | 递归查找文件类:可自定义扫描目录层数、文件类型 |
  3. ' +----------------------------------------------------------------------------+
  4. Class Scan_Folder
  5.     ' ==============================================================================================================
  6.     ' 类初始化
  7.     ' ==============================================================================================================
  8.     ' 公共变量
  9.     Private fso, regEx, sFolderSpec, sParentFolderLayer, sMaxLayer, sFileType_RegExPatternt, sFileType, sFileList, sFolderList, sEmptyFolderList
  10.     Private Scan_Folder_Only, Scan_Folder_Sub
  11.     '类初始化事件
  12.     Private Sub Class_Initialize
  13.         Set fso = CreateObject("Scripting.FileSystemObject")
  14.         Set regEx = CreateObject("VBScript.RegExp")     ' 建立正则表达式。
  15.             regEx.IgnoreCase = True     ' 设置是否区分大小写。
  16.             regEx.Global = True         ' 设置全局替换。
  17.             regEx.MultiLine = True      ' 设置多行匹配模式
  18.         Scan_Folder_Only = True           ' 仅扫描文件夹(提高效率)
  19.         Scan_Folder_Sub = True            ' 扫描子文件夹
  20.     End Sub
  21.     ' ==============================================================================================================
  22.     ' 获取设定
  23.     ' ==============================================================================================================
  24.     ' 设置扫描目录
  25.     Public Function FolderSpec(ByVal strFolderSpec)
  26.         sFolderSpec = strFolderSpec
  27.     End Function
  28.     ' 设置最大扫描目录层数
  29.     Public Function MaxLayer(ByVal strMaxLayer)
  30.         sMaxLayer = strMaxLayer
  31.     End Function
  32.     ' 设置扫描的文件类型
  33.     Public Function FileType_RegExPatternt(ByVal strFileType_RegExPatternt)
  34.         sFileType_RegExPatternt = strFileType_RegExPatternt
  35.     End Function
  36.     ' 获取文件夹列表(包括空文件夹)
  37.     Public Function GetFolderList()
  38.         Scan_Folder_Only = True
  39.         Scan_Layer sFolderSpec
  40.         GetFolderList = sFolderList
  41.     End Function
  42.     ' 获取空文件夹列表
  43.     Public Function GetEmptyFolderList()
  44.         Scan_Folder_Only = False
  45.         Scan_Layer sFolderSpec
  46.         GetEmptyFolderList = sEmptyFolderList
  47.     End Function
  48.     ' 获取文件列表
  49.     Public Function GetFileList()
  50.         Scan_Folder_Only = False
  51.         Scan_Layer sFolderSpec
  52.         GetFileList = sFileList
  53.     End Function
  54.     ' 关闭控件
  55.     Public Sub Close()
  56.         Set fso = Nothing
  57.         Set regEx = Nothing
  58.     End Sub
  59.     ' ==============================================================================================================
  60.     ' 私有函数
  61.     ' ==============================================================================================================
  62.     ' 递归扫描
  63.     Private Function Scan_Layer(strFolderspec)
  64.         On Error Resume Next
  65.         If Not Right(strFolderspec,1) = "\" Then strFolderspec = strFolderspec & "\"
  66.         If Not IsEmpty(sFolderList) Then sFolderList = sFolderList & vbCrLf
  67.         sFolderList = sFolderList & strFolderspec
  68.         ' 文件夹对象
  69.         Dim oFolder, oSubFolderItems, oSubFileItems, oSubFolder, oSubFile
  70.         Set oFolder = fso.GetFolder(strFolderspec)
  71.         ' 是否扫描 当前文件夹 的 子文件
  72.         If Scan_Folder_Only = False Then
  73.             ' 子文件对象集合
  74.             Set oSubFileItems = oFolder.Files
  75.             ' 查找当前文件夹 的 文件
  76.             If oSubFileItems.Count <> 0 Then
  77.                 For Each oSubFile In oSubFileItems
  78.                     If IsEmpty(sFileType_RegExPatternt) Or (sFileType_RegExPatternt = "") Then
  79.                         If Not IsEmpty(sFileList) Then sFileList = sFileList & vbCrLf
  80.                         sFileList = sFileList & oSubFile.Path
  81.                     Else
  82.                         ' 过滤文件类型(适用正则表达式)
  83.                         regEx.Pattern = sFileType_RegExPatternt
  84.                         If regEx.Execute( fso.GetExtensionName(oSubFile) ).Count > 0 Then
  85.                             If Not IsEmpty(sFileList) Then sFileList = sFileList & vbCrLf
  86.                             sFileList = sFileList & oSubFile.Path
  87.                         End If
  88.                     End If
  89.                 Next
  90.             End If
  91.         End If
  92.         ' 查找当前文件夹 的 子文件夹
  93.         Set oSubFolderItems = oFolder.SubFolders        ' 子文件夹对象集合
  94.         ' --------没有子文件夹时
  95.         If oSubFolderItems.Count = 0 Then
  96.             ' --------也没有子文件时(此文件夹为空)
  97.             If Scan_Folder_Only = False Then
  98.                 If oSubFileItems.Count = 0 Then
  99.                     If Not IsEmpty(sEmptyFolderList) Then sEmptyFolderList = sEmptyFolderList & vbCrLf
  100.                     sEmptyFolderList = sEmptyFolderList & strFolderspec
  101.                 End If
  102.             End If
  103.         Else
  104.             ' 限制递归的最大层数
  105.             If Not (IsEmpty(sMaxLayer) Or (sMaxLayer = "")) Then
  106.                 Dim s, f, n
  107.                 s = Replace(strFolderspec, sFolderSpec, "", vbTextCompare, -1, 1)
  108.                 f = "\"
  109.                 n = (Len(s)-Len(Replace(s,f,"",vbTextCompare,-1,1)))/Len(f)    ' 统计字符串中某一单词出现次数
  110.                 If sMaxLayer < n Then Scan_Folder_Sub = False
  111.             Else
  112.                 Scan_Folder_Sub = True
  113.             End If
  114.             If Scan_Folder_Sub = True Then
  115.                 ' ----有子文件夹时,递归查找
  116.                 For Each oSubFolder In oSubFolderItems
  117.                     'sFolderList = sFolderList & oSubFolder.Path & vbCrLf
  118.                     Scan_Layer oSubFolder.Path
  119.                 Next
  120.             End If
  121.         End If
  122.     End Function
  123. End Class
  124. ' 实例
  125. Sub Demo(ByVal strFolderPath)
  126.     Dim oScanDir, sFileList, sFolderList
  127.     ' 创建对象
  128.     Set oScanDir = New Scan_Folder
  129.     ' 指定文件夹
  130.     oScanDir.FolderSpec strFolderPath
  131.     ' 设定扫描最大层数(可为空。默认扫描所有子文件夹)
  132.     'oScanDir.MaxLayer 2
  133.     ' 指定文件类型(可为空。正则表达式规则,默认则返回所有文件)
  134.     oScanDir.FileType_RegExPatternt "(jpg|mp4)"
  135.     ' 获取结果(必填。GetFileList返回文件列表,GetFolderList返回目录列表,GetEmptyFolderList返回空目录列表)
  136.     sFileList = oScanDir.GetFileList
  137.     sFolderList = oScanDir.GetFolderList
  138.     ' 结束对象
  139.     oScanDir.Close
  140.     ' 对返回的结果进行操作(这里是获取属性)
  141.     Set fso = CreateObject("Scripting.FileSystemObject")
  142.     arrFilePath = Split(sFileList, vbCrLf, -1, vbTextCompare)
  143.     For i = 0 To UBound(arrFilePath)
  144.         strFilePath = arrFilePath(i)
  145.         WScript.Echo "所在目录: " & fso.GetFile(strFilePath).ParentFolder
  146.         WScript.Echo "名称: " & fso.GetFile(strFilePath).Name
  147.         WScript.Echo "大小: " & fso.GetFile(strFilePath).Size
  148.         WScript.Echo "最后修改时间: " & fso.GetFile(strFilePath).DateLastModified
  149.     Next
  150. End Sub
复制代码
不要嫌长……
作者: ghost-jason    时间: 2014-10-29 12:34

回复 8# yu2n


    我去大神啊。这个代码这么长还有正则表达式。这个太难了我得慢慢消化。哦对了你能不能给我分析一个代码
  1. Function GetCurrentFolderFullPath  
  2. Set fso = CreateObject("Scripting.FileSystemObject")  
  3. GetCurrentFolderFullPath = fso.GetParentFolderName(WScript.ScriptFullName)  
  4. End Function
  5. '以上代码得到该脚本所在的路径
  6. Function GetSubFolders(currentFolderFullPath)  
  7.     Set fso = CreateObject("Scripting.FileSystemObject")  
  8.     Set currentFolder = fso.GetFolder(currentFolderFullPath)  
  9.     Set subFolderSet = currentFolder.SubFolders  
  10.     For Each subFolder in subFolderSet  
  11.         'MsgBox "subFolder.Path=" & subFolder.Path   
  12.         GetSubFolders =subFolder.Path  & vbcrlf  & GetSubFolders &  
  13. GetSubFolders(subFolder.Path)   
  14.          Next  
  15. End Function  
  16. MsgBox GetSubFolders(GetCurrentFolderFullPath)
复制代码

作者: ghost-jason    时间: 2014-10-29 12:35

回复 9# ghost-jason
作者: ghost-jason    时间: 2014-10-29 12:41

回复 8# yu2n


    你给的这个长代码怎么运行后没反应啊。我想看看效果
作者: DAIC    时间: 2014-10-29 12:44

回复 9# ghost-jason


    你可能需要了解一些基础的编程知识,比如:递归。
作者: yu2n    时间: 2014-10-29 13:58

回复 11# ghost-jason
上面那段是函数,不是程序。如果你在末尾加下面一句,那他就是一个扫描D:的实例程序(请以 CScript.exe  脚本.vbs 的方式运行):
  1. Call Demo("D:\")
复制代码
如果不是对文件数目很大的目录扫描,可以使用下面的代码(同时也是一个实例程序):
  1. Dim strPath
  2. strPath = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%USERPROFILE%")
  3. WScript.Echo ScanFolder(strPath)
  4. Function ScanFolder(ByVal strPath)
  5.     Dim arr()
  6.     ReDim Preserve arr(0)
  7.     Call SCAN_FOLDER(arr, strPath)
  8.     ReDim Preserve arr(UBound(arr) - 1)
  9.     ScanFolder = Join(arr, vbCrLf)
  10. End Function
  11. Function SCAN_FOLDER(ByRef arr, ByVal folderSpec)
  12.     On Error Resume Next
  13.     Dim fso, objItems, objFile, objFolder
  14.     Set fso = CreateObject("Scripting.FileSystemObject")
  15.     Set objItems = fso.GetFolder(folderSpec)
  16.     If Right(folderSpec, 1) <> "\" Then folderSpec = folderSpec & "\"
  17.     If (Not fso.FolderExists(folderSpec)) Then Exit Function
  18.     For Each objFile In objItems.Files
  19.         arr(UBound(arr)) = objFile.Path
  20.         ReDim Preserve arr(UBound(arr) + 1)
  21.     Next
  22.     For Each objFolder In objItems.subfolders
  23.         Call SCAN_FOLDER(arr, objFolder.Path)
  24.     Next
  25.     arr(UBound(arr)) = folderSpec
  26.     ReDim Preserve arr(UBound(arr) + 1)
  27. End Function
复制代码

作者: yu2n    时间: 2014-10-29 14:09

回复 9# ghost-jason
这段代码不难,如果你要明白这个函数每行语句的意思,直接百度查 vbs fso 就知道了。
我这里重复贴一下,相信你会一目了然:
  1. VBS 文件操作对象FSO大全
  2. http://blog.sina.com.cn/s/blog_611f50100100w7tv.html
复制代码

作者: ghost-jason    时间: 2014-10-29 15:10

回复 14# yu2n


    我就是不明白图上画红线的地方就我标的那4点其他代码我都明白
作者: ghost-jason    时间: 2014-10-29 15:11

回复 12# DAIC


    恩恩。我对递归确实不是很了解。请问哪里有那方面的资料
作者: ghost-jason    时间: 2014-10-29 15:16

回复 13# yu2n


    恩恩。我试了这个代码确实厉害。效果不错。膜拜大神
作者: DAIC    时间: 2014-10-29 15:20

回复 16# ghost-jason


http://baike.baidu.com/view/96473.htm
作者: ghost-jason    时间: 2014-10-29 15:44

回复 18# DAIC


    谢了
作者: ghost-jason    时间: 2014-10-29 15:53

回复 13# yu2n


    大神我是菜鸟。那个长代码我会用了。这个短的咋调用了
作者: yu2n    时间: 2014-10-29 17:12

回复 15# ghost-jason

1. 那是【函数】Function(【过程】Sub)的【参数】,也是一种【变量】。
2. 函数自身调用自身,这里是【递归】。要掌握【函数返回值】的运用。

注:符号【】里面的内容必须掌握。
作者: yu2n    时间: 2014-10-29 17:17

回复 20# ghost-jason

函数 ScanFolder(ByVal strPath)
功能:获取指定路径下(参数)所有文件(夹)的路径,保存到一个字符串,函数将返回这个字符串。
使用:例如要知道 D:\ 下面有什么文件(夹)
  1. Dim strPath, strInfo
  2. strPath = "D:\"
  3. strInfo = ScanFolder(strPath)
  4. Msgbox strInfo
复制代码

作者: ghost-jason    时间: 2014-10-29 17:37

回复 22# yu2n


    谢谢大神
作者: ghost-jason    时间: 2014-11-7 10:04

回复 9# ghost-jason


    遍历代码分析。自己分析
  1. Function getfolderpathone    '起个容易理解的函数名
  2. Set fso = CreateObject("scripting.filesystemobject") '创建文件系统对象
  3. getfolderpathone = fso.GetParentFolderName(WScript.ScriptFullName) '得到当前脚本的父路径(绝对路径)
  4. End Function
  5. Function getfolderpath(test) '创建遍历函数名称
  6. Set fso = CreateObject("scripting.filesystemobject")'同样创建文件系统对象
  7. Set folderpath = fso.GetFolder(test)                  '得到当前单个文件夹的路径
  8. Set subfolders = folderpath.SubFolders                    '获取的个文件夹下多个个子文件夹路径
  9. For Each subfolder In subfolders                         '遍历一个一个显示单个子文件存储到一个变量当中
  10. getfolderpath= subfolder.Path & vbcrlf  & getfolderpath & getfolderpath(subfolder.Path) '得到单个子文件夹的路径
  11. 'getfolderpath(subfolder.Path)  至于这个函数test=subfolder.path 起到循环子文件夹下个子文件夹
  12. next
  13. End Function
  14. MsgBox getfolderpath(getfolderpathone) '这个函数实际上  test = getfolderhone  也就是当前脚本所在的父文件夹的路径
复制代码





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