您好,GH。解决这个问题的一个方法就是搜索整个文件系统 – 包括所有映射网络驱动器 – 并检查是否能在某个位置找到文件(让我们称它为 Budget.xls)。假设您找到这样一个文件,然后您可以使用其他一些代码来确定该文件是否恰好在 CD 或 DVD 驱动器上。
这样操作是可以的,但是这并不是最好的方法。再者,根据文件系统的大小,这可能需要耗费一些时间。有一个方法比这要好得多,即让脚本只在 CD 或 DVD 驱动器上查找该文件。您可以猜得到:这恰好就是我们将要采取的方法。
怎么,您以为脚本专家会提供一些平庸的、简陋的东西吗?
首先,我们要查找与有关计算机相连的 CD/DVD 驱动器,找到各个项的驱动器盘符。幸运的是,该操作很简单;这个小小的 WMI 脚本会报告回所有与该计算机相连的 CD/DVD 驱动器的驱动器盘符:
strComputer = "."
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_CDROMDrive")
For Each objItem in colItems
Wscript.Echo objItem.Drive
Next
在识别完驱动器盘符之后,我们可以将其与一个只在指定驱动器上查找某个文件的 WMI 查询合在一起。让我们看一下完整的脚本,然后再说明它是如何工作的:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_CDROMDrive")
For Each objItem in colItems
strDrive = objItem.Drive
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_DataFile Where FileName = 'Budget' " & _
"AND Extension = 'xls' AND Drive = '" & strDrive & "'")
If colFiles.Count > 0 Then
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
End If
Next
正如您看到的,我们首先要检索计算机上所有 CD/DVD 驱动器的集合。对于找到的各个驱动器(可能不止一个),我们将“Drive”属性(正如前面谈到的,此属性表示驱动器盘符)的值赋予一个名为 strDrive 的变量。然后我们使用第二个 WMI 查询在驱动器上搜索名为 Budget.xls 的文件。以下代码可执行此操作:
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_DataFile Where FileName = 'Budget' " & _
"AND Extension = 'xls' AND Drive = '" & strDrive & "'")
诚然,此查询看起来有点复杂;这是因为 WMI 将文件名 (Budget) 和文件扩展名 (xls) 视为两个独立的属性。因此我们必须在 WHERE 子句中使用三个参数:文件名 (Budget),文件扩展名 (xls),以及要搜索的驱动器。请注意,我们没有将驱动器盘符硬编码到其中,而是使用了变量 strDrive。正如我们刚才所说的那样,乍一看起来,感觉它有点儿复杂,不过它确实管用。
在发布查询并等待脚本对 CD/DVD 驱动器进行搜索(不会超过 15-20 秒就能完成)之后,我们就可以看一看找到了多少名为 Budget.xls 的文件。如果集合包含至少一个文件 (colFiles.Count > 0),那么我们就为找到的各个文件回显“Name”属性。(如果计数等于 0,则意味着没有找到任何名为 Budget.xls 的文件,因此我们根本不用执行任何操作。)然后,此脚本继续循环并在集合中的下一个 CD/DVD 驱动器上进行搜索。直到搜索完每个 CD/DVD 驱动器并报告成功后,此操作才结束。