1 (изменено: Malcev, 2013-04-27 21:48:28)

Тема: AHK: Безопасно вытащить USB

Может есть у кого-то простой работающий код?
Я пока откопал только это
http://www.autohotkey.com/board/topic/8 … age-drive/

2

Re: AHK: Безопасно вытащить USB

А в принципе, как указывать устройство для извлечения?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Безопасно вытащить USB

Бузопасно вытащить USB

Я бы сменил на:

AHK: Безопасно вытащить USB

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Безопасно вытащить USB

Проклятая невнимательность

А в принципе, как указывать устройство для извлечения?

В скрипте по ссылке очень удобно.
Нужно лишь вписать в скрипт

RemUMS D:\ 

5

Re: AHK: Безопасно вытащить USB

То есть просто путь? Речь только про флэшки?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Безопасно вытащить USB

Речь про USB диск, который хочутся отключить после бекапа.
У диска постоянная буква.

7 (изменено: serzh82saratov, 2013-04-27 23:04:41)

Re: AHK: Безопасно вытащить 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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Безопасно вытащить USB

А у меня код из справки не работает, может потому, что ахк 64 бит.
Аналогично  gAHK32  тоже не работает.

9

Re: AHK: Безопасно вытащить USB

Коды с autohotkey.com у меня тоже не работают.
Код из справки я проверил, во время копирования он не извлекает девайс, значит это безопасное извлечение, наверное.

Давно хотел у кого нибудь спросить, а зачем вообще использовать ахк 64 бит?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Безопасно вытащить USB

Вот тут из-за этой битности у меня код teadrinker не срабатывал.
http://forum.script-coding.com/viewtopi … 93&p=3

11 (изменено: Malcev, 2013-06-19 00:12:08)

Re: AHK: Безопасно вытащить USB

Не подходят эти варианты - не вытаскивается.
Единственный рабочий вариант нашел:

    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?
Как-то все непонятно.

12 (изменено: Malcev, 2013-06-19 13:18:59)

Re: AHK: Безопасно вытащить USB

Вот, что удалось написать

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.

Post's attachments

volumes.txt 834 b, 5 downloads since 2013-06-19 

You don't have the permssions to download the attachments of this post.

13

Re: AHK: Безопасно вытащить USB


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
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14 (изменено: serzh82saratov, 2013-06-19 13:24:19)

Re: AHK: Безопасно вытащить USB

Номер же надо, а не букву.

RegExMatch(DiskPart, ".*?\R\s+Volume\s+(\d+)\s+(\w)\s+Backup\s+.*", Match)
MsgBox % Match1
MsgBox % Match2

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Безопасно вытащить USB

Спасибо огромное!
Я к сожалению RegEx не понимаю.

16

Re: AHK: Безопасно вытащить USB

Шаблон можно поправить на:

"\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
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: Malcev, 2013-06-19 16:53:04)

Re: AHK: Безопасно вытащить USB

Спасибо за развернутое объяснение.
Начал понимать
Сейчас фрагмент кода по выгружению 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