Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Возможно ли создать .bat файл для быстрого извлечения флешки?
Просмотров: 849
 
Ответов: 8
Слишком много телодвижений приходится проделывать чтобы безопасно извлечь флешку. Как истинный ленивый айтишник я хочу автоматизировать этот процесс. Я хочу написать простой батник, который будет лежать в корне моей флешки, и который будет в один клик её извлекать. Возможно ли это средствами cmd? Курение мануала не помогло.
Если обязательно 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, но для личного пользования, как по мне, вполне сойдет.
@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);
Можно сделать, чтобы появлялось стандартное окошечко как-то так:
RunDll32.exe shell32.dll,Control_RunDLL hotplug.dll
А можно попробовать поиграться с devcon
Другой вопрос, что надо будет попроверять, сможет ли оно выдернуть устройство, когда с него запущен batch-файл.
можно поступить проще — включить для флешки режим optimized for fast removal. на семерке для съемных дисков он включен вроде бы автоматом, по крайней мере для флешек и usb-дисков это так. Тогда можно просто выдергивать ничего не освобождая.
кстати, встречный вопрос. на семерке от момента нажатия на иконке Освободить устройство проходит довольно много времени прежде чем появится менюшка с выбором устройства. на xp такого не наблюдалось, раздражает страшно. кто-нибудь знает как с этим бороться?
Понимаю что немного не в кассу, но до перехода на семерку мне очень нравилась утилита USB Safely Remove, настолько нравилась, что я их даже несколько штук купил(а это не хухры-мухры, я абы что не покупаю). В общем дает она много всякого приятного, в том числе и извлечение с помощью командной строки.
Батник можно положить и на флешку. Но пару ньюансов.
1. Перед отмонтированием — сбросить буфера. Можно было бы порекомендовать утилитку sync от sysinternals, но она на новом компьютере просит согласиться с лицензией. (распаковываем из архива, запускаем, дожидаемся отрабатывания)
2. создаем во временной папке %TEMP% скрипт, например %TEMP%\unmount.bat, который ждет секунду-две (хоть пингами), и потом отмонтирует или предлагает отмонтировать.
батник, который на флешке запускает этот временный через start:
start %TEMP%\unmount.bat
При этом батник на флешке завершает работу, чего естественно ждет временный скрипт и потом предлагает отмонтировать устройство.
Если не критично, будет скрипт в bat или утиль в командной строке, то в качестве утиля можно попробовать EjectMedia или RemoveDrive.
$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
Только, что написал. Прямо из печки.
Без использования временных файлов.
Просто положить батник в кодировке 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
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")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 /Bchcp 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
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться