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

Come posso espellere un CD tramite il cmd?

Ho cercato di espellere l'unità cd con l'uso del cmd. Tuttavia, sono in difficoltà. Cercando su internet, ho trovato solo questa risposta:

eject D:

e una risposta simile

eject D: /I

Entrambe non funzionano.

EDIT Ora la gente ha trovato questa risposta su superuser,

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

Tuttavia, ottengo un errore:

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

Risposte (6)

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

Si può 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:

Post Link: Linea di comando batch per espellere il vassoio del CD? Autore della risposta: Bruno Data Risposta: Feb 10, 2015

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

Potreste usare il metodo Shell.Application dell'oggetto COM. Da un prompt di cmd, potete abusare di un one-liner di PowerShell in questo modo:

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

Potete anche usare Windows Scripting Host (VBScript / JScript) per invocare l'oggetto COM. Ecco un esempio usando uno script ibrido Batch + JScript (salvatelo 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 preferite che il vostro script rilevi la lettera dell'unità del CD, anche questo può essere fatto. 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
4
4
2015-09-13 14:46:50 +0000

L'uso di WMPlayer.OCX.7 farà trasalire la maggior parte dei programmi anti-virus e ci sono alcune versioni di windows che vengono senza media player. Ecco un modo con shell.application e la funzione invokeVerb:

salvare questo con estensione .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>

Potete usarlo come (per maggiori informazioni -)

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

Linea di comando CD-eject oneliner:

in un file bat o direttamente in cmd questo ha funzionato dopo la prima esecuzione di wmplayer su Windows 8:

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

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
0
0
0
2016-07-13 12:56:48 +0000

Se puoi usare un'applicazione di terze parti, puoi usare Nirsoft’s nircmd . 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.