Puedes utilizar el método Shell.Application
del objeto COM. Desde un prompt de cmd, puedes abusar de un one-liner de PowerShell así
powershell "(new-object -COM Shell.Application).NameSpace(17).ParseName('D:').InvokeVerb('Eject')"
También puede utilizar Windows Scripting Host (VBScript / JScript) para invocar el objeto COM. Aquí hay un ejemplo usando un script híbrido Batch + Jscript (guárdelo con una extensión .bat):
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "CDdrive=D:"
cscript /nologo /e:JScript "%~f0" "%CDdrive%"
goto :EOF
@end // end batch / begin JScript hybrid chimera
var oSH = WSH.CreateObject('Shell.Application');
oSH.NameSpace(17).ParseName(WSH.Arguments(0)).InvokeVerb('Eject');
Si prefiere que su script detecte la letra de la unidad de CD, eso también se puede arreglar. Aquí hay una versión más completa con comentarios que explican algunos de los valores no autoexplicativos.
@if (@CodeSection == @Batch) @then
@echo off
setlocal
cscript /nologo /e:JScript "%~f0"
goto :EOF
@end // end batch / begin JScript hybrid chimera
// DriveType=4 means CD drive for a WScript FSO object.
// See http://msdn.microsoft.com/en-us/library/ys4ctaz0%28v=vs.84%29.aspx
// NameSpace(17) = ssfDRIVES, or My Computer.
// See http://msdn.microsoft.com/en-us/library/windows/desktop/bb774096%28v=vs.85%29.aspx
var oSH = new ActiveXObject('Shell.Application'),
FSO = new ActiveXObject('Scripting.FileSystemObject'),
CDdriveType = 4,
ssfDRIVES = 17,
drives = new Enumerator(FSO.Drives);
while (!drives.atEnd()) {
var x = drives.item();
if (x.DriveType == CDdriveType) {
oSH.NameSpace(ssfDRIVES).ParseName(x.DriveLetter + ':').InvokeVerb('Eject');
while (x.IsReady)
WSH.Sleep(50);
}
drives.moveNext();
}