</head> <body> <h1>DriveEject / DriveRetract</h1> <p>弹出或收回指定 CD/DVD 驱动器的托盘. DriveEject 也可以弹出一个可移动驱动器.</p> <pre class="Syntax"><span class="func">DriveEject</span> <span class="optional">Drive</span> <span class="func">DriveRetract</span> <span class="optional">Drive</span></pre> <h2 id="Parameters">参数</h2> <dl> <dt>Drive</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>如果省略, 则默认为通过从 A 到 Z 的迭代找到的第一个 CD/DVD 驱动器(如果没有找到驱动器, 则抛出异常). 否则, 请指定驱动器的字母, 后面跟着可选的冒号或冒号和反斜杠. 例如, <code>"D"</code>, <code>"D:"</code> 或 <code>"D:\"</code>.</p> <p>这也可以是一个设备路径, 形式为 <code>\\?\Volume{...}</code>, 可以通过在命令行运行 <a href="https://learn.microsoft.com/windows-server/administration/windows-commands/mountvol">mountvol</a> 来发现. 在这种情况下, 不需要为驱动器分配一个盘符字母.</p> </dd> </dl> <h2 id="Error_Handling">错误处理</h2> <p>如果检测到失败, 则抛出异常.</p> <p>这两个函数可能无法在网络驱动器或资源管理器中没有 "弹出" 选项的任何驱动器上工作. 底层的系统函数并不总是报告失败, 所以可能会或不会抛出异常.</p> <h2 id="Remarks">备注</h2> <p>在允许脚本继续之前, 函数会等待弹出或收回完成.</p> <p>可以通过测量函数完成所需的时间来判断之前的托盘状态, 如<a href="#ExToggle">下例</a>所示.</p> <p>弹出一个可移动驱动器通常相当于在资源管理器中使用 "弹出" 上下文菜单选项, 但是如果文件正在使用不会显示警告. 与安全移除硬件选项不同, 这只卸载由 <em>Drive</em> 参数标识的卷, 而不是整个设备.</p> <p>DriveEject 和 DriveRetract 对应于 <a href="https://learn.microsoft.com/windows-hardware/drivers/ddi/ntddstor/ni-ntddstor-ioctl_storage_eject_media">IOCTL_STORAGE_EJECT_MEDIA</a> 和 <a href="https://learn.microsoft.com/windows-hardware/drivers/ddi/ntddstor/ni-ntddstor-ioctl_storage_load_media">IOCTL_STORAGE_LOAD_MEDIA</a> 控制代码, 它们也可能对 CD/DVD 以外的驱动器类型产生影响, 比如磁带驱动器.</p> <h2 id="Related">相关</h2> <p><a href="DriveGetStatusCD.htm">DriveGetStatusCD</a>, <a href="Drive.htm">驱动器函数</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExEject"> <p><a class="ex_number" href="#ExEject"></a> 弹出(打开) 首个 CD/DVD 驱动器.</p> <pre>DriveEject()</pre> </div> <div class="ex" id="ExRetract"> <p><a class="ex_number" href="#ExRetract"></a> 收回(关闭) 第一个 CD/DVD 驱动器的托盘.</p> <pre>DriveRetract()</pre> </div> <div class="ex" id="ExEjectAll"> <p><a class="ex_number" href="#ExEjectAll"></a> 弹出所有可移动驱动器(CD/DVD 驱动器除外).</p> <pre>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."</pre> </div> <div class="ex" id="ExToggle"> <p><a class="ex_number" href="#ExToggle"></a> 定义一个热键, 根据函数完成的时间, 将托盘切换到相反的状态(打开或关闭).</p> <pre>#c:: { DriveEject <em>; 如果函数快速完成, 则托盘已经处于弹出状态. ; 在这种情况下, 收回托盘:</em> if (A_TimeSinceThisHotkey &lt; 1000) <em>; 如果需要, 可调整这个时间.</em> DriveRetract }</pre> </div> </body> </html>