1

Тема: AHK: Распаковка запароленного zip-архива

Доброго времени суток, товарищи!
Есть такой вопрос, к знающим товарищам на ура AutoHotkey
Можно ли средствами AutoHotkey распаковать запароленный zip архив?

2

Re: AHK: Распаковка запароленного zip-архива

Без использования сторонних приложений не получится. Если установлен какой-либо архиватор, можно использовать его через AHK командой

Run, [командная строка]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: wisgest, 2017-12-07 04:43:49)

Re: AHK: Распаковка запароленного zip-архива

AHK: Распаковка Zip-архива
WSH: архивация файлов средствами операционной системы (WinXP)

Пароль можно ввести средствами AHK:

DIALOG_TITLE = Ввод пароля
SourceFullPath = %1% ; Путь к извлекаемому файлу в архиве
	; (например, "D:\test.zip\test\1.pdf" означает, что
	; в архиве D:\test.zip находится каталог test c файлом 1.pdf)
TargetDirPath = %2% ; Путь к целевому каталогу
	; (предполагается, что он уже существует).
	; Пути не должны завершаться на "\".
Password = %3% ; Пароль (если нужен).

if (Password)
	goto 2

FSO := ComObjCreate("Scripting.FileSystemObject")
Shell := ComObjCreate("Shell.Application")
SourceFolder := Shell.NameSpace(FSO.GetParentFolderName(SourceFullPath))
SourceFolderItem := SourceFolder.ParseName(FSO.GetFileName(SourceFullPath))
TargetFolder := Shell.NameSpace(TargetDirPath)
TargetFolder.CopyHere(SourceFolderItem)
Exit

2:
Run % (A_IsCompiled ? "" : ("""" A_AhkPath """ ")) """" A_ScriptFullPath """"
		. " """ SourceFullPath """ """ TargetDirPath """"
	,,, PID
WinWait %DIALOG_TITLE% ahk_pid %PID%
ControlSetText Edit1, %Password%
ControlClick Button1

4

Re: AHK: Распаковка запароленного zip-архива

Работает, можно без запуска второго скрипта:

UnZip(A_ScriptDir . "\test.zip\test.txt", A_ScriptDir . "\Files", "1234")

UnZip(zippedFile, targetFolder, password, dialogTitle := "Ввод пароля")  {
   static info := {}
   
   info.timerID := DllCall("SetTimer", Ptr, 0, Ptr, 0, UInt, 50
                                     , Ptr, RegisterCallback( "EnterPassword", "F",, ptr := Object(info) ))
   info.password := password, info.dialogTitle := dialogTitle
   info.myPID := DllCall("GetCurrentProcessId")
   ObjRelease(ptr)

   oShell := ComObjCreate("Shell.Application")
   oFSO := ComObjCreate("Scripting.FileSystemObject")
   oSourceFolder := oShell.NameSpace( oFSO.GetParentFolderName(zippedFile) )
   oSourceFolderItem := oSourceFolder.ParseName( oFSO.GetFileName(zippedFile) )
   oTargetFolder := oShell.NameSpace(targetFolder)
   oTargetFolder.CopyHere(oSourceFolderItem)
}

EnterPassword()  {
   info := Object(A_EventInfo)
   IfWinExist, % info.dialogTitle . " ahk_class #32770 ahk_pid " . info.myPID
   {
      DllCall("KillTimer", Ptr, 0, Ptr, info.timerID)
      ControlSetText, Edit1, % info.password
      ControlClick, Button1
   }
}

Но костыль, конечно! Это ж нужно заранее название и путь файла в архиве знать. А если их там сотня?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: teadrinker, 2017-12-07 09:16:24)

Re: AHK: Распаковка запароленного zip-архива

teadrinker пишет:

Это ж нужно заранее название и путь файла в архиве знать.

Хм, а вот так не нужно, и проще:

UnZip(A_ScriptDir . "\test.zip", A_ScriptDir . "\Files", "1234")

UnZip(zipFile, targetFolder, password := "", dialogTitle := "Ввод пароля")  {
   static info := {}
   if password  {
      info.timerID := DllCall("SetTimer", Ptr, 0, Ptr, 0, UInt, 50
                                        , Ptr, RegisterCallback( "EnterPassword", "F",, ptr := Object(info) ))
      info.password := password, info.dialogTitle := dialogTitle
      info.myPID := DllCall("GetCurrentProcessId")
      ObjRelease(ptr)
   }
   if !InStr( FileExist(targetFolder), "D" )
      FileCreateDir, % targetFolder
   oShell := ComObjCreate("Shell.Application")
   items := oShell.NameSpace(zipFile).Items
   oShell.NameSpace(targetFolder).CopyHere(items)
}

EnterPassword()  {
   info := Object(A_EventInfo)
   IfWinExist, % info.dialogTitle . " ahk_class #32770 ahk_pid " . info.myPID
   {
      DllCall("KillTimer", Ptr, 0, Ptr, info.timerID)
      ControlSetText, Edit1, % info.password
      ControlClick, Button1
   }
}
teadrinker пишет:

Без использования сторонних приложений не получится.

Сначала так же пробовал, но, видимо, вместо zip в rar запаковал.
Но всё равно костыль — окно ввода пароля мелькает!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Распаковка запароленного zip-архива

Чтобы окно не мелькало можно попробовать отлавливать его создание через хук (не пробовал).
Либо вставлять снимок экрана и уже под ним посылать пароль.

7 (изменено: stealzy, 2017-12-07 12:27:43)

Re: AHK: Распаковка запароленного zip-архива

Title ведь зависит от локали. Если класса и активации недостаточно, чтобы выделить конкретное окно, лучше использовать стили.
Через хук окно ловится быстрее, чем WinWait, плюс можно сразу делать окно прозрачным, но все это не избавит полностью от мелькания. Впрочем, я на совсем другом окне испытывал.

Malcev пишет:

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

Жуть какая-то.

8

Re: AHK: Распаковка запароленного zip-архива

Почему жуть?

9

Re: AHK: Распаковка запароленного zip-архива

Проблема не только в мелькании, а еще в том, что активное в данный момент окно на какое-то время теряет активность. В общем, не очень красивое решение.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder