Come posso espellere un CD tramite il cmd?


24

Ho cercato di espellere il cd drive con l'uso del cmd.
Tuttavia, sono perplesso. Cercando su internet, ho trovato solo questa risposta:

eject D: 

e una risposta simile

eject D: /I

Entrambi non funzionano.

EDIT
Ora le persone hanno trovato questa risposta su superutente,

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

Tuttavia, viene visualizzato un errore:

colCDROMS.Item non è riconosciuto come comando interno o esterno, programma eseguibile o file batch.


Sto eseguendo Windows 7, quindi i file batch da XP potrebbero non funzionare.

Sto facendo una domanda Meta su questo dato che anch'io sono confuso, e il tag non menziona quando le batch-filedomande diventano fuori tema.
Dopo il

La versione XP mi sta dando problemi.


2
Questo non è sicuramente lo scripting di file batch; è VBS
Canadian Luke REINSTATE MONICA il

Risposte:


19

Puoi espellere un cd con un file batch (questo è 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

Questo non è il mio lavoro, l'ho trovato nella comunità di StackOverflow:

Collegamento post: riga di comando batch per espellere il vassoio CD?
Risposta dell'autore: Bruno
Data di risposta: 10 febbraio 2015


14
Devi dichiarare da dove l'hai preso: questo non è il mio lavoro, l'ho trovato online. . Se non ricordi, devi eliminare la risposta per motivi di copyright.
Dopo il

Questa risposta è in discussione su Meta: come trattiamo le risposte che non attribuiscono?
Più tardi,

6
Tecnicamente parlando, questa è una soluzione VBS, non una soluzione di file batch.
Dan Henderson,

4
Per chiarire il mio commento precedente, non intendo dire che questa non è una risposta appropriata alla domanda come affermato, ma che forse la riga iniziale "È possibile espellere un cd con un file batch" dovrebbe essere leggermente modificata. Se la configurazione del mio sistema supporta l'esecuzione di file batch ma non di script VB, questa risposta non funzionerà per me.
Dan Henderson,

A partire da dicembre 2016, Windows Defender su Windows 10 rileverà lo script generato come virus quando eseguito
hooby3dfx

18

È possibile utilizzare il metodo Shell.Applicationdell'oggetto COM InvokeVerb. Da un prompt cmd, è possibile abusare di un one-liner di PowerShell in questo modo:

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

È inoltre possibile utilizzare Windows Scripting Host (VBScript / JScript) per richiamare l'oggetto COM. Ecco un esempio usando uno script ibrido Batch + Jscript (salvalo con un'estensione .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');

Se si preferisce che lo script rilevi la lettera dell'unità per l'unità CD, anche quella può essere organizzata. Ecco una versione più completa con commenti che spiegano alcuni dei valori non autoesplicativi.

@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

Linea di comando per espellere il CD dalla riga di comando:

In un file bat o direttamente in cmdquesto ha funzionato dopo la prima esecuzione di wmplayersu Windows 8:

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

4

L'uso di WMPlayer.OCX.7stupirà la maggior parte dei programmi antivirus e ci sono alcune versioni di Windows senza lettore multimediale. Ecco un modo con shell.application e la funzione invokeVerb:

salvalo con l' .batestensione:

@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>

Puoi usarlo come (per maggiori informazioni -)

call eject.bat *

Anche con eject.bat *esso mi dice no cd drive found with letter d:. Perché potrebbe essere? Se faccio clic con il pulsante destro del mouse sull'unità e scelgo "Espelli", viene espulso.
Brad Turek,

@BradTurek - potrebbe essere la lingua (se non è l'inglese). Oppure se hai azioni personalizzate associate con il tasto destro del mouse sulle unità cd. Se si fa clic con il pulsante destro del mouse sull'azione di espulsione del dispositivo CD / DVD, il 4 ° dal basso (la posizione predefinita).
npocmaka,

0

Se è possibile utilizzare un'applicazione di terze parti, è possibile utilizzare il nircmd di Nirsoft . Su tutti i PC che ho provato (da Windows XP a Windows 8), ho potuto espellere il disco usando:

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

Dove X è la lettera dell'unità disco.


0

In Windows 10 uso questo piccolo script. Funziona!

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

Si prega di leggere di nuovo attentamente la domanda. La tua risposta non risponde alla domanda originale. Op sta usando Windows 7 e ha già provato il tuo script e ha detto che non funzionava.
David Post

è questo script per cmd, powershell o smth altro?
YakovL,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.