Как я могу извлечь компакт-диск через cmd?

24

Я пытался извлечь диск с использованием cmd.
Однако я в тупике. Ища в интернете, я нашел только такой ответ:

eject D: 

и похожий ответ

eject D: /I

Оба они не работают.

РЕДАКТИРОВАТЬ
Теперь люди нашли этот ответ на суперпользователя,

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

Однако я получаю ошибку:

colCDROMS.Item не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.

Penguinz
источник
Я использую Windows 7, поэтому пакетные файлы из xp могут не работать.
Я задаю мета-вопрос по этому вопросу, так как я тоже сбит с толку, и этот тег не упоминает, когда batch-fileвопросы становятся не по теме.
AStopher 13.09.15
XP версия дает мне проблемы.
2
Это определенно не пакетный сценарий; это VBS
канадец Люк ОБНОВИТЬ МОНИКУ

Ответы:

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:

Опубликовать ссылку: командная строка для извлечения лотка для компакт-дисков?
Ответ Автор: Bruno
Дата ответа: 10 февраля 2015

RookieTEC9
источник
14
Вам нужно указать, откуда вы это взяли: это не моя работа, я нашел ее в Интернете. , Если вы не можете вспомнить, вам нужно удалить свой ответ по причинам авторского права.
AStopher
6
Технически говоря, это решение VBS, а не пакетное решение.
Дэн Хендерсон
4
Чтобы прояснить мой предыдущий комментарий, я не хочу сказать, что это неправильный ответ на поставленный вопрос, а просто то, что, возможно, следует немного изменить начальную строку «Вы можете извлечь компакт-диск с помощью пакетного файла». Если конфигурация моей системы поддерживает выполнение командных файлов, но не скриптов VB, этот ответ не будет работать для меня.
Дэн Хендерсон
По состоянию на декабрь 2016 года Защитник Windows в Windows 10 будет обнаруживать сгенерированный сценарий как вирус при запуске
hooby3dfx
18

Вы можете использовать метод Shell.ApplicationCOM-объекта InvokeVerb. В командной строке cmd вы можете злоупотреблять однострочным отображением PowerShell:

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

Вы также можете использовать Windows Scripting Host (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

Командная строка CD-eject oneliner:

В файле bat или непосредственно в cmdэтом работал после первого запуска wmplayerна Windows 8:

powershell (New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()
GuestGeorge
источник
4

Использование WMPlayer.OCX.7заставит вздрогнуть большинство антивирусных программ, и есть некоторые версии окон, которые не имеют медиаплеера. Вот способ использования 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 *
npocmaka
источник
Даже с 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 - ваша буква дисковода.

gaborous
источник
0

В Windows 10 я использую этот маленький скрипт. Оно работает!

dim oWMP
  Set oWMP = CreateObject("WMPlayer.OCX.7")
  Set colCDROMs = oWMP.cdromCollection
  colCDROMs.Item(0).Eject
  set oWMP = nothing
EffeDB
источник
Пожалуйста, внимательно прочитайте вопрос. Ваш ответ не отвечает на оригинальный вопрос. Оп использует Windows 7, и он уже попробовал ваш скрипт и сказал, что он не работает.
DavidPostill
этот скрипт для cmd, powershell или что-то еще?
YakovL