Тема: AHK: Распаковка запароленного zip-архива
Доброго времени суток, товарищи!
Есть такой вопрос, к знающим товарищам на ура AutoHotkey
Можно ли средствами AutoHotkey распаковать запароленный zip архив?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Доброго времени суток, товарищи!
Есть такой вопрос, к знающим товарищам на ура AutoHotkey
Можно ли средствами AutoHotkey распаковать запароленный zip архив?
Без использования сторонних приложений не получится. Если установлен какой-либо архиватор, можно использовать его через AHK командой
Run, [командная строка]
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
Работает, можно без запуска второго скрипта:
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
}
}
Но костыль, конечно! Это ж нужно заранее название и путь файла в архиве знать. А если их там сотня?
Это ж нужно заранее название и путь файла в архиве знать.
Хм, а вот так не нужно, и проще:
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
}
}
Без использования сторонних приложений не получится.
Сначала так же пробовал, но, видимо, вместо zip в rar запаковал.
Но всё равно костыль — окно ввода пароля мелькает!
Чтобы окно не мелькало можно попробовать отлавливать его создание через хук (не пробовал).
Либо вставлять снимок экрана и уже под ним посылать пароль.
Title ведь зависит от локали. Если класса и активации недостаточно, чтобы выделить конкретное окно, лучше использовать стили.
Через хук окно ловится быстрее, чем WinWait, плюс можно сразу делать окно прозрачным, но все это не избавит полностью от мелькания. Впрочем, я на совсем другом окне испытывал.
вставлять снимок экрана
Жуть какая-то.
Почему жуть?
Проблема не только в мелькании, а еще в том, что активное в данный момент окно на какое-то время теряет активность. В общем, не очень красивое решение.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться