您好,PW。编写本专栏的脚本专家,刚从欧洲度假回来。他现在知道了做事有各种方式。其中有些按常理很难适应:例如,在餐馆里点了软饮料,而得到的却是未加冰又极小的一小杯,而且还不能续杯,这似乎是对人道的亵渎。另一方面,比如每年有 6 至 8 周的带薪假期,就比较容易接受。关键并不在于孰好(裹着黑巧克力酱汁的薄饼)孰坏(用蜗牛作馅的馅饼 – 我们并没有虚构)。关键在于可以去做并尝试不同的事物。
这正是将此事合理化的方式,即与我们通常的做法不同,这次我们不为您提供内置于操作系统的解决方案。理论上,只使用 WMI 即可确定计算机上最大的 20 个文件,但是编写相应的脚本却有些棘手,并且还可能花上数十万年时间运行。(这刚好相当于从您用餐完毕到巴黎侍者送上帐单之间的时间。)如果 WMI 是能找到最大的 20 个文件的唯一方法的话,我们只好硬着头皮这样做了。但是,还有更好、更容易的方法可做到这一点:下载、安装并使用 Log Parser 2.2。
如果您不熟悉 Log Parser 2.2,可以看看脚本故事专栏。Log Parser 是一个极好的小实用程序。顾名思义,它能快捷地分析纯文本日志文件。但是,Log Parser 同样能快捷地分析事件日志、文件系统、注册表,甚至 Active Directory。安装 Log Parser 后,检索(和筛选)计算机上最大的 20 个文件只需要几分钟的处理时间以及一个复杂不过如此的脚本:
Set objLogParser = CreateObject("MSUtil.LogQuery")
Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
objInputFormat.Recurse = -1
Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")
objOutputFormat.rtp = -1
strQuery = "SELECT Top 20 Path, Size FROM 'C:/*.*, D:/*.*' ORDER BY Size DESC"
objLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormat
今天,我们不详述此脚本,详细信息请参阅脚本故事专栏。但是,我们应注意此脚本先创建了 MSUtil.LogQuery 对象的一个实例,然后用下行代码表示我们要处理文件系统中的项目。
Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
然后,我们将 Recurse 属性的值设置为 -1,这会告诉 Log Parser 我们要往复搜索指定路径中的所有文件夹。(哦,对啦,我们还没有指定路径;我们马上就指定。)
前几行代码用于设置输入参数;接着,我们再用下两行代码设置输出参数:
Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")
objOutputFormat.rtp = -1
同样,我们在此只进行简要说明,第一行代码告诉 Log Parser 将数据输出到命令窗口;将 rtp 属性设置为 -1 告诉 Log Parser 立即写入所有数据,而不在完成每屏后停顿并等待用户按任意键继续。Log Parser 的用途不仅限于向命令窗口输出数据,但这似乎是当前最简单、最直观的方法。
设置好输入和输出参数后,我们接着创建 Log Parser 查询:
strQuery = "SELECT Top 20 Path, Size FROM 'C:/*.*, D:/*.*' ORDER BY Size DESC"
如果您有编写 SQL 查询的经验,此行代码应该十分简单。在此,我们要做的是找到最大的 20 个文件;为此,我们请求“Top 20”文件,按文件大小以降序排列。做出请求后,Log Parser 会捕获所有文件并按降序排列;但是,由于我们只请求前面(最大)的 20 个文件,所以屏幕上只显示最大的 20 个文件。如果需要最大的 50 个文件怎么办?那我们可以寻找最大的 50 个文件:
strQuery = "SELECT Top 50 Path, Size FROM 'C:/*.*, D:/*.*' ORDER BY Size DESC"
如果需要最小的 20 个文件怎么办?如果这样,我们把文件按升序排列,最小的文件会放在列表顶端:
strQuery = "SELECT Top 20 Path, Size FROM 'C:/*.*, D:/*.*' ORDER BY Size ASC"
看到了吗?我们告诉过您这很容易。
正如您所看到的,我们只寻找了文件路径和大小;不用说,我们同样能获得文件的其他相关信息。(详细信息请参阅 Log Parser 文档。)另外,需要注意的是,我们必须指定要搜索的每个驱动器,驱动器之间用逗号分隔:
strQuery = "SELECT Top 20 Path, Size FROM 'C:/*.*, D:/*.*' ORDER BY Size DESC"
顺便说一下,*.* 是文件系统的标准通配符,其含意为“所有文件,无论文件名和扩展名如何”。如果我们只对最大的 20 个 Microsoft Word 文档感兴趣,需将查询修改如下:
strQuery = "SELECT Top 20 Path, Size FROM 'C:/*.doc, D:/*.doc' ORDER BY Size DESC"
将脚本保存为 .vbs 文件并运行,您会惊讶地发现获得计算机上最大的 20 个文件的相关信息是多么快捷。
尽管也许不像我们发现在传统英国早餐里居然有甜豆和烤番茄那样吃惊。可是,嗨!食物就是食物,不是吗?
当然,除非里边碰巧有蜗牛。