DriveEject / DriveRetract

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

DriveEject Drive
DriveRetract Drive

参数

Drive

类型: 字符串

如果省略, 则默认为通过从 A 到 Z 的迭代找到的第一个 CD/DVD 驱动器(如果没有找到驱动器, 则抛出异常). 否则, 请指定驱动器的字母, 后面跟着可选的冒号或冒号和反斜杠. 例如, "D", "D:""D:\".

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

错误处理

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

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

备注

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

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

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

DriveEject 和 DriveRetract 对应于 IOCTL_STORAGE_EJECT_MEDIAIOCTL_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
}