Что нового

Как создать инсталлятор

chymax3m

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

Описание: Нужно создать инсталлятор программы который бы распаковался во временную папку и запустил файл setup.msi. Инсталлятор также должен включать в себя папки.

Примечания:
Инсталляция (распаковка инсталлятора) должна происходить "по-тихому"
 
Автор
C

chymax3m

Новичок
Сообщения
26
Репутация
1
Работал с Inno Setup 5, но, по моему, это проще реализовать с помощью sfx архива. Дело в том, что это не вся программа, остальную часть я уже написал, только не могу понять как реализовать включение папок в инсталлятор. Функция FileInstall позволяет включить только исполняющие файлы.
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
FileInstall'ом вываливай архив в Temp, а потом распаковывай его чем нибудь и структура папок будет в норме.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Автор
C

chymax3m

Новичок
Сообщения
26
Репутация
1
madmasles мне не надо чтоб файл SuperProg.exe появлялся в папке Program Files\SuperProg, мне надо чтобы скомпилированный инсталлятор включил в себя папки необходимые для установки SuperProg.exe и саму SuperProg.exe, и распаковал все это во временную папку для запуска дальнейшей установки SuperProg.exe.
PS: По поводу версии, так я ошибся: 3.3.6.1 (Файл справки ввел в обман)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chymax3m [?]
мне надо чтобы скомпилированный инсталлятор включил в себя папки необходимые для установки SuperProg.exe и саму SuperProg.exe
FileInstall() берет только файлы. Все нужные Вам папки Вы можете создать сначала, а потом распаковать в эти папки файлы в необходимом Вам порядке. Пример этого я Вам и привел. Вот пример с несколькими вложенными папками:
Код:
;...
$sDir_1 = @ProgramFilesDir & '\Dir_1'
$sDir_2 = $sDir_1 & '\Dir_2'
$sDir_3 = $sDir_1 & '\Dir_2\Dir_3'

DirCreate($sDir_1)
DirCreate($sDir_2)
DirCreate($sDir_3)

FileInstall('File_1.exe', $sDir_1 & '\File_1.exe', 1)
FileInstall('File_2.dll', $sDir_2 & '\File_2.dll', 1)
FileInstall('File_3.log', $sDir_3 & '\File_3.log', 1)
;...
 
Автор
C

chymax3m

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

Pelerin

Осваивающий
Сообщения
81
Репутация
23
chymax3m
Сам пользуюсь SFX в который также кладу скрипт инсталлятор и дистриб проги. Инсталлятор прикручиваю к автозапуску после распаковки SFX. После установки удаляю временную папку с дистрибом и инсталлятором.

Но можно попробовать еще такую хитрость:
Код:
#include <file.au3>
#include <array.au3>
$distrib = @ScriptDir ; папка с дистрибутивом программы
$install = @ProgramFilesDir ; папка куда прога должна инсталлироватся

If Not @Compiled Then
	$struct = _TempFile ()
	RunWait (@ComSpec&' /u /c dir /a:-d /b /s "'&$distrib&'\*.*" > "'&$struct&'"', '', @SW_HIDE)

	$open_struct = FileOpen ($struct, 32)

	$write_install = 0
	Do
		$write_install += 1
	Until FileReadLine (@ScriptFullPath, $write_install) = '; ---=== Begin Install ===---'
	$write_install += 1

	$i = 1
	Do
		$input_file = FileReadLine ($open_struct, $i)
		If Not @error Then
			$output_file = StringReplace($input_file, $distrib, '')
			Switch FileReadLine (@ScriptFullPath, $write_install)
				Case ''
					_FileWriteToLine (@ScriptFullPath, $write_install, "FileInstall ('"&$input_file&"', $install & '"&$output_file&"')", 1)
				Case Else
					_FileWriteToLine (@ScriptFullPath, $write_install, "FileInstall ('"&$input_file&"', $install & '"&$output_file&"')", 0)
			EndSwitch
			$write_install += 1
			$i += 1
		EndIf
	Until @error

	FileClose ($open_struct)
	FileDelete ($open_struct)
EndIf

; ---=== Begin Install ===---
; дальше остальной скрипт


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

Это как бы "само-инклудер" получается :robot:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ну, если пишется инсталлятор, то предполагается и деинсталлятор. С FileInstall() рентабельно возиться, если только нужен оригинальный GUI. А так проще Inno Setup и иже с ним. А SFX без деинсталлятора, да и просто не солидно как-то.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
если пишется инсталлятор, то предполагается и деинсталлятор.
Если это своя программа, то можно в ней предусмотреть запуск с параметром, например, /Uninstall с соответствующими действиями.
 
Автор
C

chymax3m

Новичок
Сообщения
26
Репутация
1
Деинсталлятор не нужен, так как работа инсталлятора созданого в AutoIt заключается в распаковке файлов во временную папку, запуска и ожидания конца инсталляции программы setup.msi, проведения нескольких манипуляций с файлами и папками, и удалении распакованых во временню папку файлов.
 
Верх