弹出/收回 CD 或 DVD 驱动器的托盘,或者设定驱动器的卷标。
Drive, Sub-command [, Drive , Value]
如下所述,sub-command、drive,和参数value之间相互依赖。
Label, Drive [, NewLabel]: 将 Drive (驱动器)的卷标改为 NewLabel (如果省略 NewLabel,驱动器卷标为空)。Drive 是字母后跟一个冒号和可选的反斜杠(可能是UNCs和驱动器映射)。例如:Drive, Label, C:, Seagate200
按照以下例子,取得当前驱动器的卷标:DriveGet, OutputVar, Label, C:
Lock, Drive: 锁定驱动器,防止其正在工作的时候被弹出。例如:"Drive, Lock, D:"。大多数的驱动器不能 "locked open"(锁定之后被打开)。然而,在驱动器打开时锁定它,将会使驱动器在关闭后进入锁定状态。对于不支持锁定的驱动器(像大多数的仅读驱动器),此命令将不起作用。该命令同样不支持 Windows 95/98/Me 下非 IDE 驱动器。如果脚本在结束前锁定了某个驱动器,则该驱动器将一直保持锁定状态,直到其它的脚本或程序将其解锁,或系统重启。如果指定的驱动器不存在或者不支持锁定特性,ErrorLevel (警告级别)将被设为1,否则为0。
Unlock, Drive: 功能同上述命令相反。在 Window NT/2000/XP 及以后版本,如果驱动器锁定了多次,则需要多次执行 Unlock 命令。例如,如果 "Drive, Lock, D:" 执行了三次,需要执行三次 "Drive, Unlock, D:" 来解锁。事实上,因为不能确定驱动器是否处于锁定状态,因此,经常需要一个变量来记录锁定的状态。
Eject [, Drive, 1]: 弹出或收回 CD 或 DVD 驱动器的托盘(弹出其它类型的影音设备或驱动器,请参见本页结尾使用的 DllCall )。
如果省略 Drive ,则使用默认的 CD / DVD 驱动器。省略最后一个参数将则弹出托盘,将其设为 1 则该命令收回或关闭托盘。例如:Drive, Eject, D:, 1
Drive Eject 命令在托盘弹出或收回完成后返回。如果托盘成功到达指定状态(打开或关闭),ErrorLevel 将被设为0(就是"没有错误")。
对于网络驱动器或者非 CD / DVD 驱动器,Drive Eject 命令很可能无法正常工作。因为这些或其它原因导致的错误,ErrorLevel 将被设为1。
通过检测执行命令所花费的时间,可以有效地确定托盘以前的状态。例如:下面的热键将触发托盘到相反状态(打开或关闭):
#c:: Drive, Eject ; 如果很短时间内完成了这条命令,托盘很可能已经弹出了。 ; 那样的话,收回托盘。 if A_TimeSinceThisHotkey < 1000 ; 调整到合适的时间。 Drive, Eject,, 1 return
如果想测定 CD 或 DVD 的影音播放状态(比如正在播放,暂停,打开等),请参见 DriveGet 命令。
出现错误时,ErrorLevel 将被设为1,否则为0。
下面的例子对弹出方法进行了改动,使之不仅能用于 CD 或 DVD 驱动器,还能用于media/devices(影音设备):
; 根据需要更新第二行的驱动器标号(不用考虑其它行)。 Driveletter = I: ; 设定为你想弹出的驱动器的标号。 hVolume := DllCall("CreateFile" , Str, "\\.\" . Driveletter , UInt, 0x80000000 | 0x40000000 ; GENERIC_READ | GENERIC_WRITE , UInt, 0x1 | 0x2 ; FILE_SHARE_READ | FILE_SHARE_WRITE , UInt, 0 , UInt, 0x3 ; OPEN_EXISTING , UInt, 0, UInt, 0) if hVolume <> -1 { DllCall("DeviceIoControl" , UInt, hVolume , UInt, 0x2D4808 ; IOCTL_STORAGE_EJECT_MEDIA , UInt, 0, UInt, 0, UInt, 0, UInt, 0 , UIntP, dwBytesReturned ; Unused. , UInt, 0) DllCall("CloseHandle", UInt, hVolume) }
Drive, Label, D:, BackupDrive
Drive, Eject,, 1 ; 收回(关闭)默认 CD 或 DVD 驱动器的托盘。