# 驱动器

弹出/收回 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

出现错误时，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)
    }

#### 相关命令

DriveGet, DriveSpaceFree

#### 示例

    Drive, Label, D:, BackupDrive
    Drive, Eject,, 1 ; 收回(关闭)默认 CD 或 DVD 驱动器的托盘。