Что нового

Инсталятор с выбором "Какую папку распаковать"

John

Новичок
Сообщения
17
Репутация
1
Версия AutoIt: 3.3.8.1

Описание: Нужен простой распаковщик. В котором можно задать иконку экзешника, заголовок окна, добавить свое описание, выбор папки для распаковки и (самое главное и не решенное для меня) выбор какую из 2х папок (х32 или х64) распаковывать в выбранную папку. Так же инсталлятор должен уметь перед распаковкой в выбранную папку скопировать некоторые файлы для бекапа в папку "Backup". Удалить некоторые файлы из папки в которую идет инсталляция. Создание ярлыка на рабочем столе тоже очень важно.

Примечания: На форуме я уже спрашивал насчет этого. И вот наиболее подходящий вариант, но тут крайне не удобно то, что нельзя добавить сразу папку и каждый файл нужно задавать отдельно.
 
A

Alofa

Гость
John сказал(а):
... но тут крайне не удобно то, что нельзя добавить сразу папку и каждый файл нужно задавать отдельно.
Я конечно понимаю, что здесь принято выкладывать готовое, но однако почитайте Это, может и вопрос сам решится.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
FileInstall лучше не использовать. если несколько маловесных файлов, то можно.
Если файлов десятки, то рар или 7z. Лучше 7z
по поводу задания - оно неполно описано
1. Какие файлы нужно копировать в бэкап?
2. Какие нужно удалять? да и нужно ли, они могут быть перезаписаны
3. Ярлык чего? папки, инсталятора или чего-то еще?



Добавлено:
Сообщение автоматически объединено:

Есть ещё важный момент. Если сделать 32-битный инсталятор, то есть вероятность, что он не распакует папку х64 в в соответствующую директорию. Перенаправление не всегда работает. Лично я обломал об это немало копий. Поэтому создавал два инсталятора- х86 и х64
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OffTopic:
John
Можно, конечно, и в автобусе дрова возить. Но лучше использовать самосвал.
Вы не задумывались, почему установщик AutoIt не написан на AutoIt?
Потому что для создания установщиков (инсталляторов) есть специализированные средства. В том числе и бесплатные. Например, Inno Setup. Имеет подробную и понятную справку, русскую версию которой легко найти в интернете. Есть Wizard, позволяющий в несколько кликов создать простой установщик, а потом "допилить" его под свои нужны. Есть графическая оболочка (не собственная), значительно упрощающая создание пакетов. Попробуйте. Уверен, что через пару-тройку часов вы уже сделаете нужный вам инсталлятор.
 
Автор
J

John

Новичок
Сообщения
17
Репутация
1
Alofa
я так понял что должен обратить внимание на то, что надо архивы в инсталлятор клать в не список файлов?
joiner
[?][/url]
понятное дело, давно уже от винрара отказался :smile:
1. Какие файлы нужно копировать в бэкап?
этот список корректируется перед каждой новой сборкой, потому нет смысла перечислять
2. Какие нужно удалять? да и нужно ли, они могут быть перезаписаны
опять же файлы разные, перезапись обязательна.

joiner
3. Ярлык чего? папки, инсталятора или чего-то еще?
ярлык распакованного exe-шника.

Есть ещё важный момент. Если сделать 32-битный инсталятор, то есть вероятность, что он не распакует папку х64 в в соответствующую директорию. Перенаправление не всегда работает.
Распаковка будет идти либо в корень диска С либо рядом с инсталлятором, потому этот вопрос не важен.

InnI
Потому что для создания установщиков (инсталляторов) есть специализированные средства. В том числе и бесплатные. Например, . Имеет подробную и понятную справку, русскую версию которой легко найти в интернете. Есть Wizard, позволяющий в несколько кликов создать простой установщик, а потом "допилить" его под свои нужны. Есть графическая оболочка (не собственная), значительно упрощающая создание пакетов. Попробуйте. Уверен, что через пару-тройку часов вы уже сделаете нужный вам инсталлятор.
я озадачивался этим вопросом, спрашивал на форуме у людепй которые гораздо больше меня в этом понимают. они ничего не ответили, потому что сами не знают "как". читал справки и инструкции, там тоже ни ответа ни намека не нашел. потом обратился сюда, здесь, как оказалось, люди более грамотные и могут помочь.
 
A

Alofa

Гость
John сказал(а):
... я так понял что должен обратить внимание на то, что надо архивы в инсталлятор клать в не список файлов?
Обратите внимание на функцию _FileInstallGetFolder(), которая автоматизирует FileInstall для всех файлов в папке, и там еще мелькнуло упоминание о resources.au3, но тут уже сами наводите справки.
 
Автор
J

John

Новичок
Сообщения
17
Репутация
1
Alofa
а если всеж 2 архива положить в инсталятор и распаковывать их по выбору, можно такое сделать?
 
A

Alofa

Гость
John сказал(а):
... можно такое сделать?
Можно. Но это должен быть либо SFX архив, либо dll архиватора вы должны будете закинуть в ресурсы вашего скомпилированного скоипта и далее работать через нее.

OffTopic:
Ну раз уж мы заговорили о SFX, возможно тут только им и можно обойтись?
http://www.7zsfx.info/ru/
 
Автор
J

John

Новичок
Сообщения
17
Репутация
1
Alofa
SFX могу организовать, в принципе им и пользуюсь за не имением лучшей альтернативы.


Добавлено:
Сообщение автоматически объединено:

InnI [?]
Например, Inno Setup. Имеет подробную и понятную справку, русскую версию которой легко найти в интернете. Есть Wizard, позволяющий в несколько кликов создать простой установщик, а потом "допилить" его под свои нужны.
как?

Alofa [?]
Ну раз уж мы заговорили о SFX, возможно тут только им и можно обойтись?
Как?

Подскажите? Мне много кто такого отвечал, но не конкретизировал и всего лишь предполагал. я уже штудировал темы и не нашел ответа. Также не знаю как на AutoIt сделать.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
John [?]
а если всеж 2 архива положить в инсталятор и распаковывать их по выбору
Зачем два архива? Один с двумя папками и распаковывать нужную. Если делать по уму, то нужно написать SFX модуль, в конец которого добавлен архив.
На AutoIt не попадался исходник SFX, но для других ЯП видел.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OffTopic:
John
Это форум по AutoIt. У Inno Setup есть свои сообщества. Например
http://krinkels.org/forums/inno-setup.250
http://forum.ru-board.com/topic.cgi?forum=5&topic=46338&start=1740
 
Автор
J

John

Новичок
Сообщения
17
Репутация
1
InnI
я там спрашивал, ответ был примерно таков "на AutoIt это все проще делается" или "попробуй на AutoIt сделать"
 
A

Alofa

Гость
Вот примерная модель, красоту наведете сами :smile::
Код:
#pragma compile(Icon, Resurses\MyIcon.ico) ; Иконка для EXE

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>

Local $sMyProgDir = '\_MyProgramm' ; ................................................ Имя каталога куда будет производиться распаковка
Local $sTempDir = @TempDir & '\~MyProgramm' & @YDAY & @HOUR & @MIN & @SEC & @MSEC & '\' ; ... Адрес временного каталога
Local $iArchive = 'Archive_x86.exe' ; .............................................. Архив по умолчанию
Local $iArchiveSize = 2000000 ; ..................................................... Общий размер файлов в архиве (в байтах)
Local $iStart, $iPID, $iElements, $hGUI, $iLabel1, $iLabel3, $iLabel3, $iButt1, $iButt2, $iButt3, $iGroup, $iRadio1, $iRadio2, $iProgress

Opt('GUIOnEventMode', 1)

$hGUI = GUICreate('Мой инсталлятор', 400, 300)
GUISetBkColor(0x78FF7A)
$iLabel1 = GUICtrlCreateLabel(' ', 30, 30, 250)
$iLabel2 = GUICtrlCreateLabel('Что распаковываем:', 30, 110)
$iLabel3 = GUICtrlCreateLabel('Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание ' & _
		'Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание ' & _
		'Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание Мое описание ', _
		50, 50, 300, 150, $SS_SUNKEN)
GUICtrlSetBkColor(-1, 0xFFFED8)
$iButt1 = GUICtrlCreateButton('Далее', 250, 250, 100)
$iButt2 = GUICtrlCreateButton('Обратно', 140, 250, 100)
$iButt3 = GUICtrlCreateButton('Папки', 330, 60, 50, 23)
$iInput = GUICtrlCreateInput(_ProgramFilesDir(), 20, 60, 300, 23)
GUICtrlSetBkColor(-1, 0xFFFED8)

$iGroup = GUICtrlCreateGroup('', 30, 130, 340, 66)
$iRadio1 = GUICtrlCreateRadio('Архив x86', 90, 155, -1, 20)
$iRadio2 = GUICtrlCreateRadio('Архив x64', 220, 155, -1, 20)
GUICtrlSetState($iRadio1, $GUI_CHECKED)

$iProgress = GUICtrlCreateProgress(20, 60, 300, 23)
GUICtrlSetState(-1, $GUI_HIDE)
_ElementsSetState(1)

GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
GUICtrlSetOnEvent($iButt1, '_Butt1')
GUICtrlSetOnEvent($iButt2, '_Butt2')
GUICtrlSetOnEvent($iButt3, '_Butt3')

GUISetState()

While Sleep(200)
	If $iStart Then
		; Прогрессбар наполняется
		$iSize = DirGetSize($sMyProgDir)
		GUICtrlSetData($iProgress, $iSize * 100 / $iArchiveSize)
		If $iSize >= $iArchiveSize Then
;~ 			FileCreateShortcut() ; Распаковка законсена. Здесь вы создаете ярлык
			Sleep(1000)
			MsgBox(4096 + 64, 'Ура!', 'Готово', 0, $hGUI)
			DirRemove($sTempDir, 1)
			Exit
		EndIf
	EndIf
WEnd

Func _Butt1()
	Local $iFI
	Switch $iElements
		Case 1
			_ElementsSetState(2)
		Case 2
			_ElementsSetState(3)
			If Not DirCreate($sTempDir) Then Exit MsgBox(4096 + 16, 'Ошибка!', 'Не удалось создать временный каталог.')
			$sMyProgDir = GUICtrlRead($iInput)
			;DirRemove($sMyProgDir) ; Перед распоковкой удаляем каталог, если таковой имеется (при желании).
			If Not DirCreate($sMyProgDir) Then Exit MsgBox(4096 + 16, 'Ошибка!', 'Не удалось создать папку назначения.')
			If GUICtrlRead($iRadio1) = $GUI_CHECKED Then
				$iFI = FileInstall('.\Resurses\Archive_x86.exe', $sTempDir & $iArchive)
			Else
				$iArchive = 'Archive_x64.exe' ; ... Архив x64
				$iArchiveSize = 7000000 ; .......... Размер файлов в архиве (в байтах)
				$iFI = FileInstall('.\Resurses\Archive_x64.exe', $sTempDir & $iArchive)
			EndIf
			$iStart = 1
			If Not $iFI Then
				MsgBox(4096 + 16, 'Ошибка!', 'Не удалось скопировать файл во временный каталог.')
				_Exit()
			EndIf
;~ 			...
;~ 			... Перед Run() копируете файлы для бекапа и удаляете некоторые файлы из папки в которую идет распаковка.
;~ 			...
			$iPID = Run($sTempDir & $iArchive & ' -y -aoa -o"' & $sMyProgDir & '\"', '', @SW_HIDE)
			If Not ProcessWait($iPID, 10) Then
				MsgBox(4096 + 16, 'Ошибка!', 'Архив не может быть распакован.')
				_Exit()
			EndIf
		Case 3
			_Exit()
	EndSwitch
EndFunc   ;==>_Butt1

Func _Butt2()
	_ElementsSetState(1)
EndFunc   ;==>_Butt2

Func _Butt3()
	GUICtrlSetData($iInput, _ProgramFilesDir(1))
EndFunc   ;==>_Butt3

Func _ProgramFilesDir($i = 0)
	Local $MyDir, $PFDir = @ProgramFilesDir
	If $i Then
		$MyDir = FileSelectFolder('Выберите папку установки', $PFDir, 7, '', $hGUI)
		If $MyDir Then $PFDir = $MyDir
	EndIf
	Return $PFDir & $sMyProgDir
EndFunc   ;==>_ProgramFilesDir


Func _ElementsSetState($i = 1)
	Switch $i
		Case 1
			$iState1 = $GUI_HIDE
			$iState2 = $GUI_SHOW
			$sLabText = 'Всем привет:'
		Case 2
			$iState1 = $GUI_SHOW
			$iState2 = $GUI_HIDE
			$sLabText = 'Куда распаковываем:'
		Case 3
			$iState1 = $GUI_HIDE
			$iState2 = $GUI_HIDE
			$sLabText = 'Ждем:'
			GUICtrlSetData($iButt1, 'Отмена')
			GUICtrlSetState($iProgress, $GUI_SHOW)
	EndSwitch
	GUICtrlSetState($iInput, $iState1)
	GUICtrlSetState($iButt2, $iState1)
	GUICtrlSetState($iButt3, $iState1)
	GUICtrlSetState($iGroup, $iState1)
	GUICtrlSetState($iRadio1, $iState1)
	GUICtrlSetState($iRadio2, $iState1)
	GUICtrlSetData($iLabel1, $sLabText)
	GUICtrlSetState($iLabel2, $iState1)
	GUICtrlSetState($iLabel3, $iState2)
	$iElements = $i
EndFunc   ;==>_ElementsSetState

Func _Exit()
	If $iStart Then
		If ProcessExists($iPID) Then ProcessClose($iPID)
		DirRemove($sMyProgDir, 1)
		DirRemove($sTempDir, 1)
	EndIf
	Exit
EndFunc   ;==>_Exit


Предварительно рядом со скриптом создайте папку Resurses. В ней должны находиться два архива "Archive_x86.exe" и "Archive_x64.exe", а также иконка "MyIcon.ico" для будущего EXE.
 
Автор
J

John

Новичок
Сообщения
17
Репутация
1
Alofa
Спасибо большое, у меня не так много времени свободного, но посмотрю обязательно.
Про "отметить тему решенной" не забыл :smile:


Добавлено:
Сообщение автоматически объединено:

Alofa
вот такая ошибочка выходит при компиляции :(
http://i85.fastpic.ru/big/2016/0906/d0/19796d2ac7d2f83460a9ac6568cb32d0.jpg
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
John
ты какой версией языка компилировал?
кстати, это
Код:
RegRead(((@OSArch = 'X86') ? 'HKLM\SOFTWARE' : 'HKLM64\SOFTWARE\Wow6432Node') & '\Microsoft\Windows\CurrentVersion', 'ProgramFilesDir')

можно заменить макросом
Код:
@ProgramFilesDir

и не надо разрядность ОСи проверять
 
Автор
J

John

Новичок
Сообщения
17
Репутация
1
Alofa
joiner
при варианте распаковки "х86" зависает на этом
http://i85.fastpic.ru/big/2016/0907/a7/9fbad663af17b9a052e9e581603afea7.jpg
Если закрыть это окошко, то папка по умолчанию удаляется даже если в ней уже был распакован вариант "х64". Это можно как то поправить?
 
A

Alofa

Гость
John сказал(а):
... Это можно как то поправить?
Можно.
Код:
; ...
Local $iArchive = 'Archive_x86.exe' ; .............................................. Архив по умолчанию
Local $iArchiveSize = 2000000 ; ..................................................... Общий размер файлов в архиве (в байтах)
; ...

Здесь переменной $iArchiveSize вы задаете общий размер всех файлов архива Archive_x86.exe в распакованном виде - это для полосы прогрессбара. Точность здесь не столь важна, главное чтобы цифра была НЕ меньше реальной.

А здесь:
Код:
; ...
Else
   $iArchive = 'Archive_x64.exe' ; ... Архив x64
   $iArchiveSize = 7000000 ; .......... Размер файлов в архиве (в байтах)
; ...

... соответственно размер файлов архива Archive_x64.exe.
Главное запомните: лучше указать больше, чем меньше.

И запускайте скрипт с правами администратора.
 
Автор
J

John

Новичок
Сообщения
17
Репутация
1
Alofa
Поправил некоторые моменты, спасибо за комменты. Добавил что-то по мелочи. Одно могу точно сказать, что подобный скрипт мне бы пришлось создавать очень долго. Потому еще раз вас благодарю :smile:
 
A

Alofa

Гость
OffTopic:
John сказал(а):
... подобный скрипт мне бы пришлось создавать очень долго.
За то, в процессе изучения, бы поняли что это не так-то и сложно :smile:
P.s: Скрипт выше - это "кусок" одного из самых первых моих скриптов, который я писал примерно год :shok:
 
Верх