找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 20970|回复: 7

[原创] VBS脚本fso shell文件处理效率对比

[复制链接]
发表于 2023-3-2 21:23:33 | 显示全部楼层 |阅读模式
本帖最后由 jyswjjgdwtdtj 于 2023-5-6 21:54 编辑

同样遍历‪C:\Program Files (x86)
并生成html文档
1、fso
  1. begin_time = Timer
  2. set fso=                createobject("scripting.filesystemobject")
  3. foldername="‪C:\Program Files (x86)"
  4. set nowfolder=fso.getfolder(foldername)
  5. filetree nowfolder
  6. sub filetree(fdobject)
  7.         set files=fdobject.files
  8.         set folders=fdobject.subfolders
  9.         for each file in files
  10.                 wscript.echo file.path
  11.         next
  12.         for each folder in folders
  13.                 wscript.echo folder.path
  14.                 filetree folder
  15.         next
  16. end sub
  17. wscript.echo Timer-begin_time
复制代码
消耗22.0625秒(更少一些)


2.shell
  1. begin_time = Timer、
  2. set shell=                createobject("shell.application")
  3. foldername=‪"C:\Program Files (x86)"
  4. set nowfolder=shell.namespace(foldername)
  5. filetree nowfolder
  6. sub filetree(fdobject)
  7.         set items=fdobject.items
  8.         for each item in items
  9.                 if item.isfolder then
  10.                         wscript.echo item.path
  11.                         filetree item.getfolder
  12.                 else
  13.                         wscript.echo file.path
  14.                 end if
  15.         next
  16. end sub
  17. wscript.echo Timer-begin_time
复制代码
消耗12.64秒(如果用“滤镜”的话估计还能快)


显然,shell快太多了
发表于 2023-3-2 21:38:31 | 显示全部楼层
我就看看大佬发高性能代码,不敢说话  
 楼主| 发表于 2023-3-2 21:56:33 | 显示全部楼层
有没有效率更高的遍历方法呢?要是能把所有文件列举出来的
发表于 2023-3-2 23:04:36 | 显示全部楼层
回复 4# jyswjjgdwtdtj


    随便换个编译型语言效率就可以薄纱vbs
发表于 2023-3-2 23:08:43 | 显示全部楼层
本帖最后由 523066680 于 2023-3-2 23:19 编辑

使用 dir /s /b 重定向导出(或者管道?)然后用文本处理的方式去转换非常高效
用 cmd /U /C dir /s /b  还能获得Unicode编码的文件清单,完美。

评分

参与人数 1技术 +1 收起 理由
jyswjjgdwtdtj + 1 当然

查看全部评分

发表于 2023-3-3 20:00:57 | 显示全部楼层
本帖最后由 523066680 于 2023-3-3 20:47 编辑

我就没有这些烦恼(逃
 楼主| 发表于 2023-5-6 21:56:29 | 显示全部楼层
抄了个wmi的
  1. Sub filetree(strFolder)
  2.         Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  3.         Set FileList = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_Directory.Name='" & strFolder & "'} Where ResultClass = CIM_DataFile")
  4.         For Each objFile In FileList
  5.                 WScript.Echo objFile.name
  6.         Next
  7.         Set FolderList = objWMIService.ExecQuery("Associators of {Win32_Directory.Name='" & strFolder & "'}Where AssocClass = Win32_Subdirectory resultRole = PartComponent")
  8.         For Each objFolder In FolderList
  9.                 filetree objFolder.name
  10.         Next
  11. End Sub
  12. filetree "C:\Program Files (x86)"
复制代码
发表于 2025-7-27 05:23:52 | 显示全部楼层
其实也不用特意对比
fso的文件和文件夹是分开的 ,获取文件时遍历了1次 ,判断文件时判断了1次 ,获取文件夹时又遍历了1次 ,判断文件夹时又判断了1次 ,总共遍历了2次 ,判断也是2次
而shell的文件和文件夹是并在一起的 ,遍历1次就能同时获取文件和文件夹了 ,而且获取时没有判断 ,只有后面手动的1次文件夹判断
很明显fso理论比shell慢1倍左右
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:02 , Processed in 0.020457 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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