# Drive

弹出/收进 CD 或 DVD 驱动器托盘, 或设置驱动器的卷标.

    Drive, SubCommand , Value1, Value2

SubCommand, Value1 和 Value2 参数相互依赖, 它们的用法如下所述.

## 子命令

对于 SubCommand, 指定以下命令之一:

- Label: 重命名驱动器的卷标.
- Lock: 阻止驱动器的弹出功能工作.
- Unlock: 恢复驱动器的弹出功能.
- Eject: 弹出或收回光盘或 DVD 驱动器的托盘.

### Label

改变 Drive 的卷标为 NewLabel.

    Drive, Label, Drive , NewLabel

Drive 由驱动器字母, 跟着冒号和可选的反斜杠组成. 如果省略 NewLabel, 则设置驱动器卷标为空.

要获取当前卷标, 请参照此例: `DriveGet, OutputVar, Label, C:`.

### Lock

禁用驱动器的弹出功能.

    Drive, Lock, Drive

Drive 由驱动器字母, 跟着冒号和可选的反斜杠组成(也许对 UNC 和映射的驱动器也有效). 例如: `Drive, Lock, D:`. 大多数驱动器不能 "在锁定之后打开". 然而, 在驱动器打开时进行锁定可能会导致驱动器在关闭后立即进入锁定状态. 此子命令对不支持锁定的驱动器(如大多数只读驱动器) 没有影响. 如果使用脚本锁定驱动器后这个脚本退出了, 那么那个驱动器会保持锁定状态, 直到另一个脚本或程序对它进行解锁, 或系统重新启动. 如果指定的驱动器不存在或不支持锁定功能, 则 ErrorLevel 被置为 1. 否则被置为 0.

### Unlock

恢复驱动器的弹出功能.

    Drive, Unlock, Drive

Drive 由驱动器字母, 跟着冒号和可选的反斜杠组成(也许对 UNC 和映射的驱动器也有效). 如果驱动器被多次锁定(至少适用于某些驱动器), 则需要多次执行 Unlock 子命令. 例如, 如果执行了 `Drive, Lock, D:` 三次, 那么需要执行 `Drive, Unlock, D:` 三次才能解锁. 由于这种情况以及并没有方法判断某个驱动器当前是否锁定的事实, 所以通常需要使用变量来记录它的锁定状态.

### Eject

弹出或收回 CD 或 DVD 驱动器的托盘.

    Drive, Eject , Drive, 1

要弹出其他类型的媒体或设备, 请参阅在页面底部的示例 #3.

Drive 由驱动器字母, 跟着冒号和可选的反斜杠组成(也许对 UNC 和映射的驱动器也有效). 如果省略 Drive, 将使用默认的 CD/DVD 驱动器. 要弹出托盘, 请省略最后一个参数. 要收回/关闭托盘, 请在最后一个参数中指定 1; 例如: `Drive, Eject, D:, 1`.

在允许脚本继续之前, 这个子命令会等待弹出或收回完成. 如果托盘已经处于指定的状态(打开或关闭), ErrorLevel 设置为 0 (例如 "没有错误").

这个子命令可能不会在网络驱动器或非 CD/DVD 驱动器上工作. 如果因为这种或其他原因失败了, ErrorLevel 设置为 1.

通过检测命令完成的时间, 也许可以判断托盘之前的状态. 例如, 下面的热键切换托盘到相反的状态(打开或关闭):

    #c::
    Drive, Eject
    ; 如果命令快速完成, 则托盘已经处于弹出状态.
    ; 在那样的情况下, 收回托盘:
    if (A_TimeSinceThisHotkey < 1000)  ; 需要时调整这个时间值.
        Drive, Eject,, 1
    return

要判断 CD 或 DVD 驱动器的媒体状态(正在播放, 停止, 打开, 等等), 请参阅 DriveGet.

## 错误处理

[v1.1.04+]: 此命令失败时会抛出异常. 想了解更多信息, 请参阅运行时错误.

如果遇到问题则 ErrorLevel 被置为 1, 否则为 0.

## 相关

DriveGet, DriveSpaceFree

## 示例

更改 D 驱动器的卷标.

    Drive, Label, D:, BackupDrive

收回(关闭) 默认的 CD 或 DVD 驱动器的托盘.

    Drive, Eject,, 1

下面的例子是另一种弹出方法, 也适用于 CD/DVD 以外的媒体/设备类型. 使用期望的驱动器字母更新下面的第一行(您可以忽略后面的其他所有行).

    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  ; 不使用.
            , "UInt", 0)
        DllCall("CloseHandle", "UInt", hVolume)
    }

dftg