2015-09-13 14:25:48 +0000 2015-09-13 14:25:48 +0000
25
25

¿Cómo puedo expulsar un CD a través del cmd?

He estado intentando expulsar la unidad de cd con el uso del cmd. Sin embargo, estoy perplejo. Buscando en internet, sólo he encontrado esta respuesta

eject D:

y una respuesta similar

eject D: /I

Ambas no funcionan.

EDIT Ahora la gente ha encontrado esta respuesta en superuser,

Set oWMP = CreateObject("WMPlayer.OCX.7")
Set colCDROMs = oWMP.cdromCollection
colCDROMs.Item(0).Eject

Sin embargo, me da un error:

colCDROMS.Item no se reconoce como un comando interno o externo, programa operable o archivo por lotes.

Respuestas (6)

19
19
19
2015-09-13 14:29:11 +0000

Se puede expulsar un cd con un archivo batch (esto es parte vbscript

@echo off
echo Set oWMP = CreateObject("WMPlayer.OCX.7") >> %temp%\temp.vbs
echo Set colCDROMs = oWMP.cdromCollection >> %temp%\temp.vbs
echo For i = 0 to colCDROMs.Count-1 >> %temp%\temp.vbs
echo colCDROMs.Item(i).Eject >> %temp%\temp.vbs
echo next >> %temp%\temp.vbs
echo oWMP.close >> %temp%\temp.vbs
%temp%\temp.vbs
timeout /t 1
del %temp%\temp.vbs

Esto no es obra mía, lo encontré en la comunidad stackoverflow:

Post Link: ¿Línea de comandos por lotes para expulsar la bandeja del CD? Autor de la respuesta: Bruno Fecha de respuesta: Feb 10, 2015

19
19
19
2015-09-13 17:53:23 +0000

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();
}
4
4
4
2015-09-13 14:46:50 +0000

El uso de WMPlayer.OCX.7 asustará a la mayoría de los programas antivirus y hay algunas versiones de windows que vienen sin media player. Aquí hay una manera con shell.application y la función invokeVerb:

guarda esto con la extensión .bat:

@cScript.EXE //noLogo "%~f0?.WSF" //job:info %~nx0 %*
@exit /b 0

   <job id="info">
      <script language="VBScript">
        if WScript.Arguments.Count < 2 then
            WScript.Echo "No drive letter passed"
            WScript.Echo "Usage: " 
            WScript.Echo " " & WScript.Arguments.Item(0) & " {LETTER|*}"
            WScript.Echo " * will eject all cd drives"
            WScript.Quit 1
        end if
        driveletter = WScript.Arguments.Item(1):
        driveletter = mid(driveletter,1,1):

        Public Function ejectDrive (drvLtr)
            Set objApp = CreateObject( "Shell.Application" ):
            Set objF=objApp.NameSpace(&H11&):
            'WScript.Echo(objF.Items().Count):
            set MyComp = objF.Items():
            for each item in objF.Items() :
                iName = objF.GetDetailsOf (item,0): 
                iType = objF.GetDetailsOf (item,1): 
                iLabels = split (iName , "(" ) :
                iLabel = iLabels(1):

                if Ucase(drvLtr & ":)") = iLabel and iType = "CD Drive" then
                    set verbs=item.Verbs():
                    set verb=verbs.Item(verbs.Count-4):
                    verb.DoIt():
                    item.InvokeVerb replace(verb,"&","") :
                    ejectDrive = 1:
                    exit function:

                end if
            next    
            ejectDrive = 2:
        End Function

        Public Function ejectAll ()
            Set objApp = CreateObject( "Shell.Application" ):

            Set objF=objApp.NameSpace(&H11&):
            'WScript.Echo(objF.Items().Count):
            set MyComp = objF.Items():
            for each item in objF.Items() :
                iType = objF.GetDetailsOf (item,1):                                 
                if iType = "CD Drive" then
                    set verbs=item.Verbs():
                    set verb=verbs.Item(verbs.Count-4):
                    verb.DoIt():
                    item.InvokeVerb replace(verb,"&","") :
                end if

            next
        End Function
        if driveletter = "*" then 
            call ejectAll
            WScript.Quit 0
        end if
        result = ejectDrive (driveletter):

        if result = 2 then
            WScript.Echo "no cd drive found with letter " & driveletter & ":"
            WScript.Quit 2
        end if

      </script>
  </job>

Puedes usarlo como (para más información -)

call eject.bat *
4
4
4
2016-03-09 13:50:12 +0000

Línea de comandos CD-eject oneliner:

En un archivo bat o directamente en cmd esto funcionó después de la primera ejecución de wmplayer en Windows 8:

powershell (New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()
0
0
0
2016-10-04 12:15:44 +0000

En Windows 10 uso este pequeño script. Funciona.

dim oWMP
  Set oWMP = CreateObject("WMPlayer.OCX.7")
  Set colCDROMs = oWMP.cdromCollection
  colCDROMs.Item(0).Eject
  set oWMP = nothing
0
0
0
2016-07-13 12:56:48 +0000

Si puedes usar una aplicación de terceros, puedes usar nircmd de Nirsoft . En todos los PCs que he probado (desde Windows XP hasta Windows 8), he podido expulsar el disco usando

"C:\path_to\nircmd.exe" cdrom open X:

Donde X es la letra de tu unidad de disco.