Як я можу вийняти компакт-диск через cmd?


24

Я намагався вийняти компакт-диск із застосуванням cmd.
Однак я заткнувся. Шукаючи в Інтернеті, я знайшов лише таку відповідь:

eject D: 

і подібну відповідь

eject D: /I

Вони обоє не працюють.

EDIT
Тепер люди знайшли цю відповідь на суперпользователя,

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

Однак я отримую помилку:

colCDROMS.Item не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл.


У мене працює Windows 7, тому пакетні файли з xp можуть не працювати.

Я задаю питання щодо мета, оскільки я також плутаюся, і тег не згадує, коли batch-fileпитання стають поза темою.
AStopher

Версія xp створює мені проблеми.


2
Це точно не сценарій пакетного файлу; це VBS
канадський Лука REINSTATE MONICA

Відповіді:


19

Ви можете вийняти компакт-диск за допомогою пакетного файлу (це частина 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

Це не моя робота, я знайшов її у спільноті stackoverflow:

Посилання посилання: Пакетний командний рядок для вилучення лотка CD?
Автор відповіді: Бруно
Дата відповідь: 10 лютого 2015 року


14
Вам потрібно вказати, звідки ви це взяли: Це не моя робота, я знайшов її в Інтернеті. . Якщо ви не можете згадати, вам потрібно видалити свою відповідь з міркувань авторських прав.
AStopher


6
Технічно кажучи, це рішення VBS, а не рішення пакетного файлу.
Ден Хендерсон

4
Щоб уточнити мій попередній коментар, я не хочу сказати, що це не відповідна відповідь на поставлене запитання, лише те, що, можливо, слід відкрити рядок відкриття "Ви можете вийняти компакт-диск із пакетним файлом". Якщо конфігурація моєї системи підтримує виконання пакетних файлів, але не сценаріїв VB, ця відповідь для мене не буде працювати.
Ден Хендерсон

Станом на грудень 2016 року Windows Defender у Windows 10 під час запуску виявить генерований скрипт як вірус
hooby3dfx

18

Ви можете використовувати метод Shell.Applicationоб'єкта COM InvokeVerb. З підказки cmd ви можете зловживати однолінійкою PowerShell таким чином:

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

Ви також можете використовувати хост сценарію Windows (VBScript / JScript) для виклику об’єкта COM. Ось приклад використання гібридного сценарію Batch + Jscript (збережіть його з розширенням .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');

Якщо ви хочете, щоб ваш сценарій виявляв букву диска для компакт-диска, це також можна впорядкувати. Ось більш повна версія з коментарями, що пояснюють деякі значення, що не пояснюють себе.

@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

Код командного рядка oneliner:

У bat-файлі або безпосередньо в cmdцьому працювали після першого запуску wmplayerWindows 8:

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

4

Використання WMPlayer.OCX.7буде вражати більшість антивірусних програм, і є деякі версії Windows, які не мають медіаплеєра. Ось спосіб з shell.application та invokeVerb функцією:

збережіть це за допомогою .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>

Ви можете використовувати його як (для отримання додаткової інформації -)

call eject.bat *

Навіть з eject.bat *цим мені це каже no cd drive found with letter d:. Чому це може бути? Якщо я натискаю правою кнопкою диска і вибираю "Витягнути", він викидається.
Бред Турек,

@BradTurek - це могла бути мова (якщо вона не англійська). Або якщо у вас є власні дії, пов’язані з клацанням правою кнопкою миші на дисках CD. Якщо ви клацніть правою кнопкою миші на пристрої CD / DVD, виштовхуючи дію слід 4-го знизу (місце за замовчуванням).
npocmaka

0

Якщо ви можете використовувати сторонні програми, ви можете використовувати nircmd Nirsoft . На всіх комп'ютерах, які я спробував (від Windows XP до Windows 8), я міг вийняти диск, використовуючи:

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

Де X - лист вашого дисковода.


0

У Windows 10 я використовую цей маленький сценарій. Це працює!

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

Будь ласка, прочитайте запитання ще раз уважно. Ваша відповідь не відповідає на початкове запитання. Op використовує Windows 7, і він вже випробував ваш сценарій і сказав, що це не працює.
DavidPostill

це сценарій для cmd, powerhell чи smth іншого?
YakovL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.