# DriveEject / DriveRetract

弹出或收回指定 CD/DVD 驱动器的托盘, 或弹出一个可移动驱动器.

    DriveEject Drive
    DriveRetract Drive

## 参数

Drive

  类型: 字符串

  驱动器的字母, 后面跟着可选的冒号或冒号和反斜杠. 例如, `D`, `D:` 或 `D:\`.

  这也可以是一个设备路径, 形式为 `\\?\Volume{...}`, 可以通过在命令行运行 mountvol 来发现. 在这种情况下, 不需要为驱动器分配一个盘符.

  如果省略, 则默认为通过从 A 到 Z 的迭代找到的第一个 CD/DVD 驱动器. 如果没有找到驱动器, 则抛出异常.

## 错误处理

如果检测到失败, 则抛出异常.

这两个函数可能无法在网络驱动器或资源管理器中没有 "弹出" 选项的任何驱动器上工作. 底层的系统函数并不总是报告失败, 所以可能会或不会抛出异常.

## 备注

在允许脚本继续之前, 函数会等待弹出或收回完成.

可以通过测量函数完成所需的时间来判断之前的托盘状态, 如下例所示.

弹出一个可移动驱动器通常相当于在资源管理器中使用 "弹出" 上下文菜单选项, 但是如果文件正在使用不会显示警告. 与安全移除硬件选项不同, 这只卸载由 Drive 参数标识的卷, 而不是整个设备.

DriveEject 和 DriveRetract 对应于 IOCTL_STORAGE_EJECT_MEDIA 和 IOCTL_STORAGE_LOAD_MEDIA 控制代码, 它们也可能对 CD/DVD 以外的驱动器类型产生影响, 比如磁带驱动器.

## 相关

DriveGetStatusCD, 驱动器函数

## 示例

弹出(打开) 首个 CD/DVD 驱动器.

    DriveEject()

收回(关闭) 第一个 CD/DVD 驱动器的托盘.

    DriveRetract()

弹出所有可移动驱动器(CD/DVD 驱动器除外).

    Loop Parse DriveGetList("REMOVABLE")
    {
        if MsgBox("Eject " A_LoopField ":, even if files are open?",, "y/n") = "yes"
            DriveEject(A_LoopField)
    }
    else
        MsgBox "No removable drives found."

定义一个热键, 根据函数完成的时间, 将托盘切换到相反的状态(打开或关闭).

    #c::
    {
        DriveEject
        ; 如果函数快速完成, 则托盘已经处于弹出状态.
        ; 在这种情况下, 收回托盘:
        if (A_TimeSinceThisHotkey < 1000)  ; 如果需要, 可调整这个时间.
            DriveRetract
    }

dftg