Jak mogę wysunąć płytę CD za pomocą cmd?

24

Próbowałem wysunąć napęd CD za pomocą cmd.
Jestem jednak zakłopotany. Szukając w Internecie, znalazłem tylko tę odpowiedź:

eject D: 

i podobna odpowiedź

eject D: /I

Oba nie działają.

EDYCJA
Teraz ludzie znaleźli tę odpowiedź na superużytkowniku,

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

Jednak pojawia się błąd:

colCDROMS.Item nie jest rozpoznawany jako wewnętrzna lub zewnętrzna komenda, program operacyjny lub plik wsadowy.

Pingwin
źródło
Korzystam z systemu Windows 7, więc pliki wsadowe z XP mogą nie działać.
Zadaję na to pytanie Meta, ponieważ jestem również zdezorientowany, a tag nie wspomina, kiedy batch-filepytania stają się nie na temat.
AStopher
Wersja xp sprawia mi problemy.
2
To zdecydowanie nie jest skryptowanie plików wsadowych; to VBS
Kanadyjczyk Luke REINSTATE MONICA

Odpowiedzi:

19

Możesz wysunąć płytę CD za pomocą pliku wsadowego (jest to część 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

To nie jest moja praca, znalazłem ją w społeczności stackoverflow:

Link do strony: Batch Wiersz poleceń do wysuwania tacy CD?
Odpowiedz autor: Bruno
Data odpowiedzi: 10 lutego 2015 r

RookieTEC9
źródło
14
Musisz podać, skąd go masz: To nie jest moja praca, znalazłem ją online. . Jeśli nie pamiętasz, musisz usunąć swoją odpowiedź ze względu na prawa autorskie.
AStopher
Ta odpowiedź jest dyskutowana na Meta: Jak postępować z odpowiedziami, które nie przypisują?
AStopher
6
Technicznie rzecz biorąc, jest to rozwiązanie VBS, a nie rozwiązanie pliku wsadowego.
Dan Henderson
4
Aby wyjaśnić mój poprzedni komentarz, nie chcę powiedzieć, że nie jest to odpowiednia odpowiedź na zadane pytanie, a jedynie to, że być może wiersz otwierający „Możesz wysunąć płytę CD z plikiem wsadowym” powinien zostać nieco zmodyfikowany. Jeśli konfiguracja mojego systemu obsługuje wykonywanie plików wsadowych, ale nie skryptów VB, ta odpowiedź nie będzie dla mnie działać.
Dan Henderson
Począwszy od grudnia 2016 r. Program Windows Defender w systemie Windows 10 wykryje wygenerowany skrypt jako wirusa po uruchomieniu
hooby3dfx
18

Możesz użyć metody Shell.Applicationobiektu COM InvokeVerb. Z wiersza polecenia cmd możesz w ten sposób nadużywać jedno-liniowy PowerShell:

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

Do wywołania obiektu COM można także użyć hosta skryptów Windows (VBScript / JScript). Oto przykład użycia hybrydowego skryptu Batch + Jscript (zapisz go z rozszerzeniem .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');

Jeśli wolisz, aby Twój skrypt wykrywał literę napędu CD, można to również ustawić. Oto bardziej kompletna wersja z komentarzami wyjaśniającymi niektóre wartości, które nie wymagają wyjaśnienia.

@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
źródło
4

Wiersz polecenia CD-eject oneliner:

W pliku nietoperza lub bezpośrednio w cmdtym działało po pierwszym uruchomieniu wmplayerw systemie Windows 8:

powershell (New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()
GuestGeorge
źródło
4

Korzystanie WMPlayer.OCX.7zaskoczy większość programów antywirusowych, a niektóre wersje systemu Windows są dostarczane bez odtwarzacza multimediów. Oto sposób z shell.application i invokeVerb:

zapisz to z .batrozszerzeniem:

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

Możesz go używać jak (więcej informacji -)

call eject.bat *
npocmaka
źródło
Nawet z eject.bat *tym mówi mi no cd drive found with letter d:. Dlaczego to może być? Jeśli kliknę napęd prawym przyciskiem myszy i wybiorę „Wysuń”, zostanie on wysunięty.
Brad Turek
@BradTurek - może to być język (jeśli nie jest to angielski). Lub jeśli masz niestandardowe działania związane z kliknięciem prawym przyciskiem myszy na dyskach CD. Po kliknięciu prawym przyciskiem myszy operacji wysuwania urządzenia CD / DVD powinna być czwarta od dołu (miejsce domyślne).
npocmaka
0

Jeśli możesz korzystać z aplikacji innej firmy, możesz użyć nircmd Nirsoft . Na wszystkich komputerach, których wypróbowałem (od Windows XP do Windows 8), mogłem wysunąć dysk za pomocą:

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

Gdzie X to litera napędu.

gaboryczny
źródło
0

W Windows 10 używam tego małego skryptu. To działa!

dim oWMP
  Set oWMP = CreateObject("WMPlayer.OCX.7")
  Set colCDROMs = oWMP.cdromCollection
  colCDROMs.Item(0).Eject
  set oWMP = nothing
EffeDB
źródło
Przeczytaj uważnie pytanie ponownie. Twoja odpowiedź nie odpowiada na pierwotne pytanie. Op używa systemu Windows 7, a już wypróbował skrypt i powiedział, że to nie działa.
DavidPostill
czy ten skrypt dla cmd, powershell czy cokolwiek innego?
JakowL,