Тема: AHK: Безопасно вытащить USB
Может есть у кого-то простой работающий код?
Я пока откопал только это
http://www.autohotkey.com/board/topic/8 … age-drive/
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Может есть у кого-то простой работающий код?
Я пока откопал только это
http://www.autohotkey.com/board/topic/8 … age-drive/
А в принципе, как указывать устройство для извлечения?
Бузопасно вытащить USB
Я бы сменил на:
AHK: Безопасно вытащить USB
Проклятая невнимательность ![]()
А в принципе, как указывать устройство для извлечения?
В скрипте по ссылке очень удобно.
Нужно лишь вписать в скрипт
RemUMS D:\ То есть просто путь? Речь только про флэшки?
Речь про USB диск, который хочутся отключить после бекапа.
У диска постоянная буква.
У меня код из справки работает:
Driveletter = G: ; Set this to the drive letter you wish to eject.
hVolume := DllCall("CreateFile"
, Str, "\\.\" . Driveletter
, UInt, 0x80000000 | 0x40000000 ; GENERIC_READ | GENERIC_WRITE
, UInt, 0x1 | 0x2 ; FILE_SHARE_READ | FILE_SHARE_WRITE
, UInt, 0
, UInt, 0x3 ; OPEN_EXISTING
, UInt, 0, UInt, 0)
if hVolume <> -1
{
DllCall("DeviceIoControl"
, UInt, hVolume
, UInt, 0x2D4808 ; IOCTL_STORAGE_EJECT_MEDIA
, UInt, 0, UInt, 0, UInt, 0, UInt, 0
, UIntP, dwBytesReturned ; Unused.
, UInt, 0)
DllCall("CloseHandle", UInt, hVolume)
} правда я не знаю безопасное ли это извлечение?
Ещё можно покурить:
http://www.autohotkey.com/board/topic/8 … vice_eject
http://www.autohotkey.com/board/topic/4 … vice_eject
ну и:
http://msdn.microsoft.com/en-us/library … e/ff539806
А у меня код из справки не работает, может потому, что ахк 64 бит.
Аналогично gAHK32 тоже не работает.
Коды с autohotkey.com у меня тоже не работают.
Код из справки я проверил, во время копирования он не извлекает девайс, значит это безопасное извлечение, наверное.
Давно хотел у кого нибудь спросить, а зачем вообще использовать ахк 64 бит?
Вот тут из-за этой битности у меня код teadrinker не срабатывал.
http://forum.script-coding.com/viewtopi … 93&p=3
Не подходят эти варианты - не вытаскивается.
Единственный рабочий вариант нашел:
Type diskpart and wait for the diskpart prompt (DISKPART>)
Type list volume
Note the volume number of the USB drive carefully (use listed properties such as drive letter, label, type and size for help)
Type select volume <number>, where <number> is the volume number noted above
Type remove all dismount
Type exit to quit Diskpart
Now you should be able to safely remove your USB drive without fear of data loss.
Как мне это все забабахать через autohotkey, зная лейбл диска?
Пока написал вот это
Run, %comspec% /c DISKPART.exe /s C:hdd.txt > C:volumes.txtа в hdd.txt
list volumeНа выходе получаем
Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: TV-PC
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 X DVD-ROM 0 B No Media
Volume 1 System Rese NTFS Partition 100 MB Healthy System
Volume 2 C NTFS Partition 465 GB Healthy Boot
Volume 3 D NTFS Partition 931 GB Healthy Pagefile
Volume 4 G Backup NTFS Partition 2794 GB Healthy
Volume 5 F Backup NTFS Partition 2794 GB Healthy
Volume 6 Z Usb Partition 2794 GB Healthy
По идее, чтобы узнать номер диска надо обрабатывать volumes.txt
А обрабатывать его тогда надо в hdd.txt?
Как-то все непонятно.
Вот, что удалось написать
watchfolder = C:\1
FileRemoveDir, %watchfolder%, 1
FileCreateDir, %watchfolder%
FileAppend, list volume, %watchfolder%\hdd.txt
Run, %comspec% /c ""DISKPART.exe" "/s" "%watchfolder%\hdd.txt" > "%watchfolder%\volumes.txt""
WinWaitClose, ahk_class ConsoleWindowClass
sleep 1000
; получаем букву диска в переменную var
; Loop, read, %watchfolder%\volumes.txt
FileAppend, select volume %var%`nremove all dismount`nexit, %watchfolder%\hdd1.txt
Run, %comspec% /c ""DISKPART.exe" "/s" "%watchfolder%\hdd.txt""
WinWaitClose, ahk_class ConsoleWindowClass
msgbox, DONEНо никак не получается распарсить инфу с CMD.
Помогите, пожалуйста, вытащить номер volume первого диска с лейблом Backup.
DiskPart =
(
Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: TV-PC
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 X DVD-ROM 0 B No Media
Volume 1 System Rese NTFS Partition 100 MB Healthy System
Volume 2 C NTFS Partition 465 GB Healthy Boot
Volume 3 D NTFS Partition 931 GB Healthy Pagefile
Volume 4 G Backup NTFS Partition 2794 GB Healthy
Volume 5 F Backup NTFS Partition 2794 GB Healthy
Volume 6 Partition 2794 GB Healthy Offline
)
RegExMatch(DiskPart, ".*?\R\s+Volume\s+\d+\s+(\w)\s+Backup\s+.*", Match)
MsgBox % Match1
Номер же надо, а не букву.
RegExMatch(DiskPart, ".*?\R\s+Volume\s+(\d+)\s+(\w)\s+Backup\s+.*", Match)
MsgBox % Match1
MsgBox % Match2
Спасибо огромное!
Я к сожалению RegEx не понимаю.
Шаблон можно поправить на:
"\R\s+Volume\s+(\d+)\s+(\w)\s+Backup\s+"Тут всё очень просто: Ищется строка указанная в шаблоне.
То есть кусок текста из переменной где подряд идут:
\R - перенос строки
\s+ - один и более пробельных символов
Volume - слово Volume
\s+ - один и более пробельных символов
\d+ - одна и более цифр
\s+ - один и более пробельных символов
\w - одна буква
\s+ - один и более пробельных символов
Backup - слово Backup
\s+ - один и более пробельных символов
Так как:
\d+ заключена в скобки, её содержимое в найденной подстроке будет в Match1.
\w заключена в скобки после \d+, её содержимое будет в Match2.
Сама найденная строка в Match.
RegExMatch(DiskPart, "\R\s+Volume\s+(\d+)\s+(\w)\s+Backup\s+", Match)
MsgBox % Match
MsgBox % Match1
MsgBox % Match2Спасибо за развернутое объяснение.
Начал понимать ![]()
Сейчас фрагмент кода по выгружению usb выглядит так и вроде работает
copyDest = Z:
watchfolder = D:\Abola\TEMP_HDD
FileRemoveDir, %watchfolder%, 1
FileCreateDir, %watchfolder%
FileAppend, list volume, %watchfolder%\hdd1.txt
Runwait, %comspec% /c ""DISKPART.exe" "/s" "%watchfolder%\hdd1.txt" > "%watchfolder%\hdd2.txt""
FileRead, DiskPart, %watchfolder%\hdd2.txt
RegExMatch(DiskPart, "\R\s+Volume\s+(\d+)\s+\w\s+USB_HDD\s+", Match)
FileAppend, select volume %Match1%`nremove all dismount, %watchfolder%\hdd3.txt
Runwait, %comspec% /c ""DISKPART.exe" "/s" "%watchfolder%\hdd3.txt""
FileAppend, select volume %Match1%`nassign letter=%copyDest%, %watchfolder%\hdd4.txt
Runwait, %comspec% /c ""DISKPART.exe" "/s" "%watchfolder%\hdd4.txt""
FileRemoveDir, %watchfolder%, 1
RunWait, D:\Abola\USB_HDD\RemUMS.exe %copyDest% ; безопасно выгружаем usb
MsgBox, 4096, USB_HDD, DONE!
ExitApp
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться