Что нового

Как запароленные архивы программно распаковать

StarEdik

Новичок
Сообщения
365
Репутация
4
Версия AutoIt: 3.3.6.1

Описание:
Привет всем!!!
Прошу помощи при написание скрипта. За ранее благодарен.
Идея: Мобильный скрипт и именем «Отчет.ехе»на флешке. При запуске скрипт проходить проверку на правильности пароля и при положительном ответе, он должен распаковать запароленные архивы в указанные папки, запустить RWP.ехе с параметром запуска "Show" .Архивов 3.
1.Таблицы - Шаблоны.(Tab.rar – в ресурсах) .Пароль - 123456
– Путь распаковки (С:\Temp\Account\Table)
2.Исполняемый файл.(RWP.rar – закреплен к скрипту с помощью FileInstall) ,который после всех распаковок запускается основным скриптом на выполнение и при выгрузке удалить все распакованные файлы.
– Путь распаковки (С:\Temp\Account\RWP) .Пароль - Qwerty
3.Документы в формате .xls и .doc (Doк.rar – обновляемый – лежит в папке рядом со скриптом )
– Путь распаковки (С:\Temp\Account\Calc) . Пароль – Q1w2e3r4t5y6

Форма для примера
Код:
#AutoIt3Wrapper_Res_File_Add=Tab.rar, rt_rcdata, DEFAULT_1

#include <Resources.au3> 
#include <string.au3>
$sCryptedPass = '9BA81FDF0B89502F8E2B599A';('qwerty')
$sPassInput = InputBox('Password', 'Enter your password:', 'qwerty', '')
If @error Then Exit
If _StringEncrypt(0, $sCryptedPass, $sPassInput) = $sPassInput Then
   	ConsoleWrite('OK'&@CRLF)
	    ;Здесь должно происходить распаковка Tab.rar в папку @TempDir & '\Account\Table (Пароль - 123456)?????????????????????
		FileInstall(@ScriptDir & '\RWP.rar', @TempDir & '\Account\RWP\*.*');???????????????????
		Sleep(1000)
		Run(@TempDir & '\Account\RWP\RWP.exe' & ' ' & 'Show')
            ;Здесь должно происходить распаковка Dok.rar в папку @TempDir & \Account\Calc  (Пароль – Q1w2e3r4t5y6) ?????????????????????
Else
    MsgBox(0, 'False', '"' & $sPassInput & '" is false.')
	;Exit
EndIf
Примечания:
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Попробуй так (не тестил)

Код:
#include <Resources.au3>
#include <string.au3>
$tempRar = @TempDir & '\Account\RAR\'
$FolderPath = ''
$ArchPath = ''
$pass = ''
$sCryptedPass = '9BA81FDF0B89502F8E2B599A';('qwerty')
$sPassInput = InputBox('Password', 'Enter your password:', 'qwerty', '')
If @error Then Exit
If _StringEncrypt(0, $sCryptedPass, $sPassInput) = $sPassInput Then
    ConsoleWrite('OK'&@CRLF)
        FileInstall(@ScriptDir & '\Tab.rar', $tempRar & '*.*')
        $pass = '123456'
        $FolderPath = @TempDir & '\Account\Table\'
        $ArchPath = $tempRar & 'Tab.rar'
        _UnPack ()
        FileInstall(@ScriptDir & '\RWP.rar',  $tempRar & '*.*')
        $pass = 'Qwerty'
        $FolderPath = @TempDir & '\Account\RWP\'
        $ArchPath = $tempRar & 'RWP.rar'
        _UnPack ()
        Sleep(1000)
        Run(@TempDir & '\Account\RWP\RWP.exe' & ' ' & 'Qwerty')
        FileInstall(@ScriptDir & '\Dok.rar', $tempRar & '*.*')
        $pass = 'Q1w2e3r4t5y6'
        $FolderPath = @TempDir & '\Account\Calc\'
        $ArchPath = $tempRar & 'Dok.rar'
        _UnPack ()
Else
    MsgBox(0, 'False', '"' & $sPassInput & '" is false.')
    ;Exit
   EndIf

Func _UnPack ()
 DirCreate ( $FolderPath );лучше создавать предварительно вручную, иначе RAR может выдать ошибку - Нет файлов для извлечения
 $pid  = RunWait(@ComSpec &' /c unrar x -r -o+ -p' & $pass & ' ' & $ArchPath & ' ' & $FolderPath, "", @SW_HIDE, 0x2);unrar.exe нужно скопировать в system32, либо указать прямой путь к этому файлу. 
EndFunc
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Привет beliy, мое почтение. Проверил скрипт. Все Ок. Благодарю за сделанное. :ok:
Вы были правы.
;лучше создавать предварительно вручную, иначе RAR может выдать ошибку - Нет файлов для извлечения
Код:
;
If _StringEncrypt(0, $sCryptedPass, $sPassInput) = $sPassInput Then
DirCreate ( $tempRar ) ; Добавил  строчку , где производиться проверка ,для создания папок
ConsoleWrite('OK'&@CRLF)
;

Хотелось бы уточнить:
;unrar.exe нужно скопировать в system32, либо указать прямой путь к этому файлу.
- Как скрипту указать ,что unrar.exe находиться вместе со скриптом.
- Возможно ли, всё это без unrar.exe ( средствами AutoIt выполнить – например с помощью Zip.au3)
 

beliy

Продвинутый
Сообщения
372
Репутация
72
сорь что не сразу ответил...
- Как скрипту указать ,что unrar.exe находиться вместе со скриптом.
попробуй так...
Код:
$unrarDir = @ScriptDir & '\unrar.exe'
;...
Func _UnPack ()
 DirCreate ( $FolderPath );лучше создавать предварительно вручную, иначе RAR может выдать ошибку - Нет файлов для извлечения
 $pid  = RunWait(@ComSpec &' /c ' &  $unrarDir & ' x -r -o+ -p' & $pass & ' ' & $ArchPath & ' ' & $FolderPath, "", @SW_HIDE, 0x2);unrar.exe нужно скопировать в system32, либо указать прямой путь к этому файлу. 
EndFunc


Возможно ли, всё это без unrar.exe ( средствами AutoIt выполнить – например с помощью Zip.au3)

да, но только не Zip.au3, а Rar.au3, но лично мне с unrar работать удобнее (его можно будет извлечь тем же FileInstall)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
beliy
Спасибо за исправление.Вот что выдал скрипт

"C:\Documents" ­Ґ пў«пҐвбп ў­гв७­Ґ© Ё«Ё ў­Ґи­Ґ©
Є®¬ ­¤®©, ЁбЇ®«­пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐв­л¬ д ©«®¬.

"C:\Documents" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
поробуй так:

Код:
$unrarDir = '"' & @ScriptDir & '\unrar.exe"' ;добавили двойные кавычки
;...
Func _UnPack ()
 DirCreate ( $FolderPath );лучше создавать предварительно вручную, иначе RAR может выдать ошибку - Нет файлов для извлечения
 $pid  = RunWait(@ComSpec &' /c ' &  $unrarDir & ' x -r -o+ -p' & $pass & ' ' & $ArchPath & ' ' & $FolderPath, "", @SW_HIDE, 0x2);unrar.exe нужно скопировать в system32, либо указать прямой путь к этому файлу.
EndFunc
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Не совсем понял последний вопрос. Если имеется в виду распаковка минуя извлечения во временные папки, то практически никак... Разве что копать в сторону изменения хранения данных, например, хранить в бинарном виде и потом генерировать все файлы, НО размер exe значительно возрастет.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
beliy
Не совсем понял последний вопрос. Если имеется в виду распаковка минуя извлечения во временные папки, то практически никак.
Нет.Просто внутри ехе 2 архива

1-ый - #AutoIt3Wrapper_Res_File_Add=Tab.rar, rt_rcdata, DEFAULT_1

2-ой - FileInstall(@ScriptDir & '\RWP.rar', @TempDir & '\Account\RWP\*.*')
А рядом с ехе в папке еше 1 архив ,3-й
3.Документы в формате .xls и .doc (Doк.rar – обновляемый – лежит в папке рядом со скриптом )

У нас сейчас происходить распаковка с помошью FileInstall и при компиляции выдает ощибку «Invalid File install() function» :-[ :scratch:
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Так сразу и писал бы по поводу ошибки ;)
выдержка из справки:

Когда эта функция выполняется в нескомпилированном скрипте, вместо неё выполняется операция копирования (чтобы обеспечить отладку без необходимости компилировать скрипт).
Файл сохраняет оригинальные метки даты создания/модификации при извелечении.

Каталог назначения файла должен существовать, иначе эта функция вернёт 0 и не будет создавать ни каталога, ни файла. Следует использовать DirCreate() чтобы создать нужный каталог.

также добавим флаг на перезапись в случае ,если файлы имеются.
Сорь прост тестить некогда - пишу по пямяти((
попробуй так...
Код:
DirCreate (@TempDir & '\Account\RWP\')
FileInstall(@ScriptDir & '\RWP.rar', @TempDir & '\Account\RWP\*.*',1)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Сейчас проверью и отпишусь :-[ :smile:
:( Нет, не компилируется :scratch:
Вот скрипт
Код:
#AutoIt3Wrapper_Res_File_Add=Tab.rar, rt_rcdata, DEFAULT_1
#include <Resources.au3>
#include <string.au3>
$tempRar = @TempDir & '\Account\RAR\'
$FolderPath = ''
$ArchPath = ''
$pass = ''
$sCryptedPass = '9BA81FDF0B89502F8E2B599A';('qwerty')
$sPassInput = InputBox('Password', 'Enter your password:', 'qwerty', '')
$unrarDir = '"' & @ScriptDir & '\unrar.exe"' ;добавить двойные кавычки в одинарных
If @error Then Exit
If _StringEncrypt(0, $sCryptedPass, $sPassInput) = $sPassInput Then
	DirCreate ( $tempRar )
	DirCreate (@TempDir & '\Account\RWP\')
;-----------------------------------------------------------------------------------
	_ResourceSaveToFile($tempRar & '\Tab.rar', 'DEFAULT_1', $RT_RCDATA) ;сохраняем архив из ресурса
        $pass = '123456'
        $FolderPath = @TempDir & '\Account\Table\'
        $ArchPath = $tempRar & 'Tab.rar'
        _UnPack ()
;------------------------------------------------------------------------------------

       FileInstall(@ScriptDir & '\RWP.rar', @TempDir & '\Account\RWP\*.*',1)
       ;FileInstall(@ScriptDir & '\RWP.rar',  $tempRar & 'RWP.rar')
        $pass = 'Qwerty'
        $FolderPath = @TempDir & '\Account\RWP\'
        $ArchPath = $tempRar & 'RWP.rar'
        _UnPack ()
        Sleep(1000)
        Run(@TempDir & '\Account\RWP\RWP.exe' & ' ' & 'Show')
;-------------------------------------------------------------------------------------
		FileCopy(@ScriptDir & '\Dok.rar', $tempRar & 'Dok.rar', 8)
       	$pass = 'Q1w2e3r4t5y6'
        $FolderPath = @TempDir & '\Account\Calc\'
        $ArchPath = $tempRar & 'Dok.rar'
        _UnPack ()
;-------------------------------------------------------------------------------------
		Sleep(5000)
		;DirRemove(@TempDir & '\Account\RAR',1)
Else
    MsgBox(0, 'False', '"' & $sPassInput & '" is false.')
    Exit
EndIf

Func _UnPack ()
  $pid  = RunWait(@ComSpec &' /c ' &  $unrarDir & ' x -r -o+ -p' & $pass & ' ' & $ArchPath & ' ' & $FolderPath, "", @SW_HIDE, 0x2)
EndFunc
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Пришлось у себя тестить, проблема была в том что для FileInstall путь к исходному файлу надо указывать полностью не используя переменных...

замени так:
Код:
FileInstall('D:\Путь_к_исходному_файлу\RWP.rar', @TempDir & '\Account\RWP\*.*',1)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
beliy
И так работает.
Код:
FileInstall('RWP.rar',  $tempRar & 'RWP.rar')

И все ОК.Так что Спасибо.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Тогда по правилах хорошего тона на форуме надо бы поставить теме статус решонной ;)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
beliy
А как архивы в ехе обновлять :scratch:В смысле програмно при истечение времени и.т.д
 

beliy

Продвинутый
Сообщения
372
Репутация
72
если прога только у тебя будет, то тогда проще и быстрее всего просто перекомпилировать с новыми архивами
 
Верх