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

24

He estado tratando de expulsar la unidad de CD con el uso de cmd.
Sin embargo, estoy perplejo. Buscando en Internet, solo encontré esta respuesta:

eject D: 

y una respuesta similar

eject D: /I

Ambos no funcionan.

EDITAR
Ahora la gente ha encontrado esta respuesta en superusuario,

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

Sin embargo, recibo un error:

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

Penguinz
fuente
Estoy ejecutando Windows 7, por lo que los archivos por lotes de XP pueden no funcionar.
Estoy haciendo una pregunta Meta sobre esto ya que también estoy confundido, y la etiqueta no menciona cuándo las batch-filepreguntas se vuelven fuera de tema.
AStopher
La versión xp me está dando problemas.
2
Definitivamente no es una secuencia de comandos de archivo por lotes; es VBS
Canadian Luke REINSTATE MONICA

Respuestas:

19

Puede expulsar un CD con un archivo por lotes (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

Este no es mi trabajo, lo encontré en la comunidad stackoverflow:

Enlace de publicación: ¿ Línea de comando por lotes para expulsar la bandeja de CD?
Autor de la respuesta: Bruno
Fecha de respuesta: 10 de febrero de 2015

NovatoTEC9
fuente
14
Debe indicar de dónde lo obtuvo: este no es mi trabajo, lo encontré en línea. . Si no puede recordar, debe eliminar su respuesta por razones de derechos de autor.
AStopher
Esta respuesta se está discutiendo en Meta: ¿Cómo manejamos las respuestas que no atribuyen?
AStopher
66
Técnicamente hablando, esta es una solución VBS, no una solución de archivo por lotes.
Dan Henderson el
44
Para aclarar mi comentario anterior, no quiero decir que esta no sea una respuesta apropiada para la pregunta como se indicó, simplemente que tal vez la línea de apertura "Puede expulsar un CD con un archivo por lotes" debe modificarse ligeramente. Si la configuración de mi sistema admite la ejecución de archivos por lotes pero no de scripts VB, esta respuesta no funcionará para mí.
Dan Henderson el
A partir de diciembre de 2016, Windows Defender en Windows 10 detectará el script generado como un virus cuando se ejecute
hooby3dfx
18

Puede usar el método Shell.Applicationdel objeto COM InvokeVerb. Desde un indicador de cmd, puede abusar de una línea de PowerShell de la siguiente manera:

powershell "(new-object -COM Shell.Application).NameSpace(17).ParseName('D:').InvokeVerb('Eject')"

También puede usar 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, también se puede organizar. Aquí hay una versión más completa con comentarios que explican algunos de los valores que no se explican por sí mismos.

@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();
}
rojo
fuente
4

Línea de comando de expulsión de CD oneliner:

En un archivo bat o directamente en cmdesto funcionó después de la primera ejecución de wmplayerWindows 8:

powershell (New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()
GuestGeorge
fuente
4

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

guarda esto con la .batextensión:

@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 *
npocmaka
fuente
Incluso con eject.bat *eso me lo dice no cd drive found with letter d:. ¿Por qué podría ser esto? Si hago clic derecho en la unidad y elijo "Expulsar", se expulsa.
Brad Turek
@BradTurek: podría ser el idioma (si no es inglés). O si tiene acciones personalizadas asociadas con el clic derecho sobre unidades de CD. Si hace clic con el botón derecho en la acción de expulsión del dispositivo de CD / DVD, la cuarta debe ser desde la parte inferior (el lugar predeterminado).
npocmaka
0

Si puede usar una aplicación de terceros, puede usar el nircmd de Nirsoft . En todas las PC que probé (desde Windows XP a Windows 8), pude expulsar el disco usando:

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

Donde X es la letra de tu unidad de disco.

gaborous
fuente
0

En Windows 10 utilizo este pequeño script. ¡Funciona!

dim oWMP
  Set oWMP = CreateObject("WMPlayer.OCX.7")
  Set colCDROMs = oWMP.cdromCollection
  colCDROMs.Item(0).Eject
  set oWMP = nothing
EffeDB
fuente
Por favor lea la pregunta otra vez cuidadosamente. Su respuesta no responde a la pregunta original. Op está utilizando Windows 7 y ya ha probado su script y dijo que no funcionó.
DavidPostill
¿Es este script para cmd, powershell o algo más?
YakovL