Задать вопрос

Возможно ли создать .bat файл для быстрого извлечения флешки?

Слишком много телодвижений приходится проделывать чтобы безопасно извлечь флешку. Как истинный ленивый айтишник я хочу автоматизировать этот процесс. Я хочу написать простой батник, который будет лежать в корне моей флешки, и который будет в один клик её извлекать. Возможно ли это средствами cmd? Курение мануала не помогло.
  • Вопрос задан
  • 15610 просмотров
Подписаться 14 Средний Комментировать
Решения вопроса 1
@amirul
Если обязательно bat файл, то как то так
eject.cmd:

@if (0 == 1) @end /*
@cscript //E:JScript //Nologo %~f0
@exit /B %ERRORLEVEL%
*/
var shell = new ActiveXObject("Shell.Application");
shell.NameSpace(17).ParseName("E:").InvokeVerb("Eject");
WSH.Sleep(2000);


К сожалению, для версии, не зависящей от языка, нужно использовать CM API, но для личного пользования, как по мне, вполне сойдет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
mambet
@mambet
Можно сделать, чтобы появлялось стандартное окошечко как-то так:
RunDll32.exe shell32.dll,Control_RunDLL hotplug.dll
А можно попробовать поиграться с devcon
Другой вопрос, что надо будет попроверять, сможет ли оно выдернуть устройство, когда с него запущен batch-файл.
Ответ написан
mr_locke
@mr_locke
можно поступить проще — включить для флешки режим optimized for fast removal. на семерке для съемных дисков он включен вроде бы автоматом, по крайней мере для флешек и usb-дисков это так. Тогда можно просто выдергивать ничего не освобождая.

кстати, встречный вопрос. на семерке от момента нажатия на иконке Освободить устройство проходит довольно много времени прежде чем появится менюшка с выбором устройства. на xp такого не наблюдалось, раздражает страшно. кто-нибудь знает как с этим бороться?
Ответ написан
pietrovich
@pietrovich
Понимаю что немного не в кассу, но до перехода на семерку мне очень нравилась утилита USB Safely Remove, настолько нравилась, что я их даже несколько штук купил(а это не хухры-мухры, я абы что не покупаю). В общем дает она много всякого приятного, в том числе и извлечение с помощью командной строки.
Ответ написан
Комментировать
gjf
@gjf
Если не критично, будет скрипт в bat или утиль в командной строке, то в качестве утиля можно попробовать EjectMedia или RemoveDrive.
Ответ написан
Комментировать
AstaRoth
@AstaRoth
$Ret = DllCall('SRD.dll', 'str', 'SafeRemoveDrive', 'str', 'G')
If Int($Ret[0]) = 0 Then
MsgBox(0, '', 'Error')
Else
MsgBox(0, '', 'Successful')
EndIf


yashied.narod2.ru/ProjectFiles/Miscellaneous/SRD.dll
Ответ написан
Комментировать
@Igor_Ya
Только, что написал. Прямо из печки.
Без использования временных файлов. Извлечёт все диски на флэшке (эммм - до 5 дисков), даже если они не читаются Виндой и не имеют в данный момент присвоенного имени диска.
Просто положить батник в кодировке OEM 866 на флэшку.
chcp 866
@echo off
setlocal enabledelayedexpansion
set N=%~d0
mshta vbscript:Execute("CreateObject(""WScript.Shell"").Run ""cmd /v /c cd /d c:&for /l %%n in (0,1,5) do ( for /f """"usebackq"""" %%i in (`wmic logicaldisk where """"Name='!N!'"""" get DriveType`) do (if %%i==2 (mshta """"vbscript:CreateObject(""""Scripting.FileSystemObject"""").GetStandardStream(1).Write(CreateObject^(""""Shell.Application""""^).NameSpace^(17^).ParseName^(""""!N!""""^).InvokeVerb^(""""Eject""""^))&Close()"""")))"",0,false:close")

Если кому надо из винды, то вариант для понимания попроще. Просто замените значение переменной ImyaFleshki на нужное. С флэшки не работает.
chcp 866
@echo off
set "ImyaFleshki=Clover"
set operation=Eject
set fname=%~n0
setlocal enabledelayedexpansion
for /f "tokens=2 delims==" %%a in ('wmic logicaldisk where "DriveType=2 and VolumeName='%ImyaFleshki%'" get Name /value^|find "="') do (
set Name=%%a
:loop
for /f "tokens=2 delims==" %%i in ('wmic logicaldisk where "Name='!Name!'" get Description /value^|find "="') do set Description=%%i
for /f tokens^=1^ delims^=^" %%a in ("!Description!") do set Description=%%a
if "!Description!"=="Removable Disk" (
call :disconnect !Name! %operation% ret
set "Description="
goto :loop
) else ( call :msgBox "Ваше устройство '!ImyaFleshki!' отсоединено от компьютера. Теперь вы можете безопасно извлечь его."
goto :eof)
)
call :msgBox "Устройство '!ImyaFleshki!' не обнаружено в файловой системе."
setlocal disabledelayedexpansion
goto :eof
:disconnect [DirName] [Operation] [ret]
set command=CreateObject("Shell.Application").NameSpace(17).ParseName("%~1").InvokeVerb("%~2")
SetLocal EnableExtensions
for /f "UseBackQ tokens=* delims=" %%i in (`mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(%command%)&Close()"`) do set "%~3=OK"
SetLocal DisableExtensions
exit /B
:msgBox [msgText]
PowerShell -Command^
"[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null;"^
"[System.Windows.Forms.MessageBox]::Show(\"%~1\", 'Извлечение флэш накопителя','OK','Exclamation')"
set %~2=OK
exit /B

Ну ... и извлечь все флэшки. Работать правильно будет только из Винды. Если лежит на флэшке - извлечёт только "чужие" накопители.
chcp 866
@echo off
set operation=Eject
setlocal enabledelayedexpansion
for /f "tokens=2 delims==" %%a in ('wmic logicaldisk where "DriveType=2" get Name /value^|find "="') do (
		set Name=%%a
		:loop
		for /f "tokens=2 delims==" %%i in ('wmic logicaldisk where "Name='!Name!'" get Description /value^|find "="') do set Description=%%i
		for /f tokens^=1^ delims^=^" %%a in ("!Description!") do set Description=%%a
		if "!Description!"=="Removable Disk" (
			call :disconnect !Name! %operation% ret
			set "Description="
			goto :loop
		) else ( call :msgBox "Вы можете безопасно извлечь все флэшки."
				goto :eof)
)
call :msgBox "В файловой системе не обнаружено флэш карт."
setlocal disabledelayedexpansion
goto :eof
:disconnect [DirName] [Operation] [ret]
  set command=CreateObject("Shell.Application").NameSpace(17).ParseName("%~1").InvokeVerb("%~2")
  SetLocal EnableExtensions
  for /f "UseBackQ tokens=* delims=" %%i in (`mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(%command%)&Close()"`) do set "%~3=OK"
  SetLocal DisableExtensions
exit /B
:msgBox [msgText]
PowerShell -Command^
 "[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null;"^
 "[System.Windows.Forms.MessageBox]::Show(\"%~1\", 'Извлечение флэш накопителя','OK','Exclamation')"
set %~2=OK
exit /B
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы