您好,TW。有趣的问题,它时不时地就出现。过去用户只有驱动器 A、B 和 C 时,这很容易解决,您往往可以猜到不同于这三个驱动器号的任何驱动器号都是可用的。但现在,情况不同了:不但网络的增长意味着用户很可能有一个驱动器或两个映射的驱动器,而且 CD-ROM 和 DVD 驱动器、USB 驱动器、便携式硬盘和其他类似设备的广泛应用几乎使得计算机所拥有的驱动器必然超出驱动器 A、B 和 C 。那么在这个高科技字母池中,该如何确定哪个驱动器号可用以及哪个不可用?
实际上,这比您可能想象的更简单。首先,我们只需要考虑 23 个字母,我们可以忘掉驱动器 A、B 和 C。(当然,驱动器 A 和 B 是为软盘保留的并且计算机中的第一硬盘驱动器将总是驱动器 C。)要查找下一个可用的驱动器号,我们可以从驱动器 D 开始,然后是驱动器 E,驱动器 F,一直继续下去,直到找到了可用的驱动器号或直到搜索到驱动器 Z。
当然,要这样做,我们还需要了解计算机上哪些驱动器号正在使用。幸运地是,这非常简单:我们可以使用 Win32_LogicalDisk 类,检查 DeviceID 属性,以返回正在使用中的驱动器号的集合。这样:
strComputer = "."Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
For Each objDisk in colDisks Wscript.Echo objDisk.DeviceID Next
C: D: E: G: Z:
显然,我们可以查看此数据,然后轻松确定下一个可用的驱动器号。但为什么我们必须做所有这些工作?不是有人说过通过运行脚本来确定下一个可用驱动器号的事情吗?
的确我们做到了。这就是可以确定计算机上下一个可用的驱动器号的脚本。我们来看看这个脚本,然后我们将解释它如何工作:
Set objDictionary = CreateObject("Scripting.Dictionary")
strComputer = "."Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
For Each objDisk in colDisks objDictionary.Add objDisk.DeviceID, objDisk.DeviceID Next
For i = 67 to 90 strDrive = Chr(i) & ":" If objDictionary.Exists(strDrive) Then Else Wscript.Echo strDrive & " is the next available drive letter."Wscript.Quit End If Next Wscript.Echo "There are no available drive letters on this computer.”
开始时我们创建了一个 Dictionary 对象的实例,该脚本对象便于我们在内存中存储数据,同样重要的是便于我们确定哪些数据存储在内存中,哪些不存储在内存中。(关于 Dictionary 对象更详细的讨论,请参阅 Microsoft Windows 2000 Scripting Guide(Microsoft Windows 2000 脚本指南)的“脚本运行时入门”。)然后我们使用 Win32_LogicalDisk 类检索计算机上当前使用的所有驱动器号 (DeviceID) 的列表。但是,此时我们不会将信息回显到屏幕上,而是将其存储到 Dictionary 对象中。这就是下面这行代码所做的工作:
objDictionary.Add objDisk.DeviceID, objDisk.DeviceID
词典中的元素由两部分组成:关键字和条目。对这个特定脚本,我们实际上只需要关键字(它为我们提供快速确定词典中是否有信息存在的方法),但 Dictionary 对象两部分都需要。因此,我们简单地将关键字和条目都设置为驱动器号,因而将相同的“objDisk.DeviceID”参数传递给 Add 方法。
当脚本完成对驱动器号集合的循环后,我们就会有一个词典,由以下关键字(和条目)组成:
C: D: E: G: Z:
现在我们有了当前计算机上使用的所有驱动器号的列表,剩下所要做的就是查找下一个可用驱动器号。这就是下面代码块所做的工作:
For i = 67 to 90 strDrive = Chr(i) & ":" If objDictionary.Exists(strDrive) Then Else Wscript.Echo strDrive & " is the next available drive letter."Wscript.Quit End If Next Wscript.Echo "There are no available drive letters on this computer.”
不用担心,我们会解释该代码。如我们以前提到过的,我们需要检查字母 D 到 Z,以确定其中的字母是否可用于映射驱动器。实现该目的的真正简单的办法是创建一个 For Next 循环,对这些字母的 ASCII 值循环一遍。如其所示,大写字母 D 的 ASCII 值是 67,大写字母 Z 的 ASCII 值是 90。因此 For Next 循环从 67 运行到 90:
For i = 67 to 90
ASCII 值对 For Next 循环很适用,但不太适用于驱动器映射(很少计算机有,例如,驱动器 81:)。因此,在下一行代码中,我们使用 Chr 函数将 ASCII 值转换回其等价字符。例如,当循环第一次运行时,i (循环变量)等于 67。Chr 函数取该值 (67),然后将其转换为大写字母 D。我们在末尾加一个冒号,变量 strDrive 将取值“D:”,看起来很像驱动器号。
剩下的就是小孩的游戏。(啊,假定您的孩子知道一些 VBScript。)我们使用 Dictionary 对象的 Exists 方法查看词典中是否存在第一个驱动器号 D:。记住,词典包括不可用的所有驱动器号的列表。如果在词典中找到 D:,那么意味着已有驱动器使用该字母。在这种情况下,我们继续循环,试试下一个驱动器号 (E:)。
如果我们找到一个不在词典中的驱动器号,会发生什么情况呢? 噢,这意味着该驱动器号对我们可用。因此,我们做两件事。首先,我们回显指示该驱动器号可用的消息。然后,我们使用 Quit 方法退出该脚本。为什么此时退出脚本呢? 啊,我们已经找到了下一个可用的驱动器号,那就是我们所需要的全部,无须再继续检查字母了。因此我们退出,继续做我们的事。
如果没有驱动器号可用怎么办? 如果发生了这种情况,我们将退出 For Next 循环并运行脚本的最后一行,它只表明无驱动器号可用。由于一找到可用的驱动器号我们就会退出脚本,所以仅当我们搜索驱动器号失败时才执行该行代码。