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

96897
Penguinz

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

eject D: 

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

eject D: /I 

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

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

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

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

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

22
Я использую Windows 7, поэтому пакетные файлы из xp могут не работать. 8 лет назад 0
Я задаю мета-вопрос по этому вопросу, так как я тоже сбит с толку, и этот тег не упоминает о том, когда вопросы `batch-file 'становятся не по теме. cybermonkey 8 лет назад 0
XP версия дает мне проблемы. 8 лет назад 0
На Meta: [Когда вопросы «пакетного файла» не по теме?] (Http://meta.stackoverflow.com/questions/305964/when-are-batch-file-questions-off-topic). cybermonkey 8 лет назад 0
Понятно, что это невозможно в чистом пакетном режиме. Что именно вы пытаетесь достичь? Он работает тихо? Допустимы ли другие среды командной строки (Powershell)? Daniel B 8 лет назад 0
Это определенно не пакетный сценарий; это VBS Canadian Luke 8 лет назад 2
https://www.codeguru.com/cpp/wp/system/cd-rom/article.php/c5775/CDREXE--OpenClose-CD-Drives-Programmatically.htm neverMind9 5 лет назад 0

6 ответов на вопрос

20
RookieTEC9

You can eject a cd with a batch file (this is part 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 

This is not my work, I found it in the stackoverflow community:

Post Link: Batch Command Line to Eject CD Tray?
Answer Author: Bruno
Date Answered: Feb 10, 2015

Вам нужно указать, откуда вы это взяли: * Это не моя работа, я нашел ее в Интернете. *. Если вы не можете вспомнить, вам нужно удалить свой ответ по причинам авторского права. cybermonkey 8 лет назад 14
Этот ответ обсуждается в Meta: [Как мы имеем дело с ответами, которые не являются атрибутами?] (Http://meta.stackoverflow.com/questions/305965/how-do-we-deal-with-answers-that- делать-не-атрибут) cybermonkey 8 лет назад 0
Технически говоря, это решение VBS, а не пакетное решение. Dan Henderson 8 лет назад 6
Чтобы прояснить мой предыдущий комментарий, я не хочу сказать, что это неправильный ответ на поставленный вопрос, а просто то, что, возможно, следует немного изменить начальную строку «Вы можете извлечь компакт-диск с помощью пакетного файла». Если конфигурация моей системы поддерживает выполнение командных файлов, но не скриптов VB, этот ответ не будет работать для меня. Dan Henderson 8 лет назад 4
По состоянию на декабрь 2016 года Защитник Windows в Windows 10 будет обнаруживать сгенерированный сценарий как вирус при запуске hooby3dfx 7 лет назад 0
16
rojo

You could use the Shell.Application COM object's InvokeVerb method. From a cmd prompt, you can abuse a PowerShell one-liner thusly:

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

You can also use Windows Scripting Host (VBScript / JScript) to invoke the COM object. Here's an example using a hybrid Batch + Jscript script (save it with a .bat extension):

@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 you prefer to have your script detect the drive letter for the CD drive, that can be arranged as well. Here's a more complete version with comments explaining some of the non-self-explanatory values.

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

Using WMPlayer.OCX.7 will startled most of the anti-virus programs and there are some versions of windows that come without media player. Here's a way with shell.application and invokeVerb function:

save this with .bat extension:

@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) & " " 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> 

You can use it like (for more info -)

call eject.bat * 
4
GuestGeorge

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

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

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

Если вы можете использовать стороннее приложение, вы можете использовать nircmd от Nirsoft . На всех компьютерах, которые я пробовал (от Windows XP до Windows 8), я мог извлечь диск, используя:

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

Где X - ваша буква дисковода.

0
EffeDB

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

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