Drive

优质
小牛编辑
131浏览
2023-12-01

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

Drive, Sub-command [, Drive , Value]

sub-command, drive 和 value 参数互相依赖, 它们的用法描述如下.

Label, Drive [, NewLabel]: 改变 Drive 的卷标为 NewLabel (如果省略 NewLabel, 则设置驱动器卷标为空). Drive 由驱动器字母, 跟着冒号和可选的反斜线组成 (也许对 UNC 和映射的驱动器也有效). 例如:Drive, Label, C:, Seagate200

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


Lock, Drive: 禁用驱动器的弹出功能。例如:Drive, Lock, D:。大多数驱动器不能 "在锁定之后打开". 然而, 在驱动器打开时进行锁定可能会导致驱动器在关闭后立即进入锁定状态. 对于不支持锁定的驱动器(例如大多数只读驱动器),此命令没有效果。如果使用脚本锁定驱动器后这个脚本退出了, 那么那个驱动器会保持锁定状态, 直到另一个脚本或程序对它进行解锁, 或系统重新启动. 如果指定的驱动器不存在或不支持锁定功能, 则 ErrorLevel 被置为 1. 否则被置为 0.


Unlock, Drive: 反转上面的功能. 如果对同一驱动器锁定了多次,则需使用 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 (例 "没有错误").

Drive Eject 可能对网络驱动器或非 CD/DVD 驱动器无效。如果因为这种或其他原因失败了, 则 ErrorLevel 被置为 1.

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

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

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

ErrorLevel

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

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

备注

下面的例子是另一种弹出方法, 它对除了 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)
}

相关

DriveGet, DriveSpaceFree

示例

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