Возвращаясь к вопросу об оболочке.
Я написал простенькую. Прошу не судить строго. Я, правда, позаимствовал кусочек кода у LEX1 для загрузки Мерлина. Познаний работы с форумом нет (как поместить rar не знаю), поэтому вставляю куски так...
"Маленькое" пояснение:
Можно разнести программы по разным вкладкам, для удобства, т.к. в куче можно что-то и не поставить. Оболочка предусматривает растановку галочек по умолчанию.
Иногда скрипт написан и добавлен в файлы оболочки, но его забыли скомпилировать (каюсь, грешен). Тогда вылетит сообщение при запуске оболочки об отсутствии exe'шников (лучше оболочку запускать до ее записи на диск
), но checkbox'ы все равно будут... А при инсталяции отсутствующие exe-файлы будут проигнорированы...
Принято как умолчание:
1 - название файлов установщиков - "Setup.exe"; должен существовать
2 - файл подсказки - "~.txt"; может существовать
3 - файл "Default.ini" отвечает за установку приоритета установки программ, чем ближе запись (относительный или абсольтный путь до setup.exe) к началу файла, тем раньше программа установится. Так же он отвечает, устанавливать ли программу по умолчанию или нет ("true" - после запуска оболочки на соответствующем checkbox'е будет стоять галочка, что либо иное - нет)
4 - файл "Panels.ini" отвечает за вкладки и их содержимое.
ВНИМАНИЕ:
1 - все записи из "Default.ini" должны быть в файле "Panels.ini" и наоборот. Это определяет наличие всех checkbox'ов и их правильную расстановку, а следовательно и установленные приложения
2 - оболочка не устанавливает программы. Она лишь запускает файлы setup.exe, которые собственно и производят установку
3 - оболочка ждет завершения работы предыдущего exe'шника и лишь потом запускает следующий. Если exe'шник "завис" по какой-либо причине, то его надо завершить вручную. Поэтому проверьте каждый скрипт на "зависание" на чистой и "свежей" операционке (VMware Workstation рулит
4 - некоторые программы при запуске иногда меняют свои заголовки. Например, "Nero 7 - мастер установки" вместо "Nero 7 Ultra Edition - мастер установки"
5 - содержимое файла "Settings.ini" посмотрите сами, там все описано.
Данная оболочка облегчит жизнь пользователю, который переставляет или ставит OS не только себе, но и другим (как эти другие иногда задалбливают
).
P.S. Благодаря приоритету установки программ можно расставить ярлыки в нужном порядке
[more=Сама оболочка]
#include <Array.au3>
#include <GUIConstants.au3>
#include <file.au3>
AutoItSetOption("TrayIconHide", 1); Скрытие иконки в трее
$Title = "Инсталлятор-р-р"; Надпись на форме
Dim $Ins[1], $Def[1], $Pan[1], $Check[1], $Count[1];
Dim $CheckCount, $CheckHeight, $CheckWidth, $CheckCheckWidth, $CheckCheckHeight, $CheckTabHeight, $CheckTabWidth, $TabFormWidth, $TabFormHeight;
OpenDefault($Ins, $Def, 'Default.ini'); Открытие файла устанавливать ли по умолчанию (программы устанавливаются по порядку сверху-вниз)
OpenPanels($Pan, $Check, $Count, "Panels.ini"); Открытие файла вкладок (список вкладок и программ на них)
OpenSettings($CheckCount, $CheckHeight, $CheckWidth, $CheckCheckWidth, $CheckCheckHeight, $CheckTabHeight, $CheckTabWidth, $TabFormHeight, $TabFormWidth, "Settings.ini"); Открытие файла расстояния элементов на форме
Dim $Panels[1], $CheckBox[1];
$n=GetMaxCheck($Count, $CheckCount); Количество checkbox'ов по вертикали
$TabWidth=$CheckCheckWidth*($CheckCount-1)+$CheckWidth*$CheckCount+$CheckTabWidth*2; Ширина панели
$TabHeight=$CheckCheckHeight*($n-1)+$CheckTabHeight*2+$n*$CheckHeight; Высота панели
Select ; Получаем размер панели для checkbox'ов
Case $CheckCount=1
$h=4*($CheckCheckHeight+2*$CheckHeight);
Case $CheckCount=2
$h=2*($CheckCheckHeight+2*$CheckHeight);
Case $CheckCount=3
$h=2*($CheckCheckHeight+2*$CheckHeight);
Case $CheckCount>3
$h=1*($CheckCheckHeight+2*$CheckHeight);
EndSelect;
$FormHeight=$TabHeight+$TabFormHeight*2+$h; Высота формы
$FormWidth=$TabWidth+$TabFormWidth*2; Ширина формы
GUICreate($Title, $FormWidth, $FormHeight); Создание формы
GUICtrlCreateTab($TabFormWidth, $TabFormHeight, $TabWidth, $TabHeight); Создание панели
For $i=1 To UBound($Pan)-1
_ArrayAdd($Panels, GUICtrlCreateTabItem($Pan[$i])); Создание вкладок
For $j=$Count[$i] To $Count[$i+1]-1
$h=Div($j-$Count[$i], $CheckCount);
$h=$TabFormHeight+$CheckTabHeight+$h*($CheckCheckHeight+$CheckHeight)+10;
$w=Mod($j-$Count[$i], $CheckCount);
$w=$TabFormWidth+$CheckTabWidth+$w*($CheckCheckWidth+$CheckWidth);
_ArrayAdd($CheckBox, GUICtrlCreateCheckbox(GetFolder($Check[$j]), $w, $h, $CheckWidth, $CheckHeight));
$str=StringFormat("%s%s%s%s", @ScriptDir, "\", $Check[$j], "\~.txt");
If FileExists($str) Then
$str=Load($str); Загрузка описания
GUICtrlSetTip($CheckBox[$j], $str); Добавление описания
EndIf;
Next;
Next;
GUICtrlCreateTabitem (""); Завершение создания вкладок
$left=$TabFormWidth+$CheckTabWidth; Определение левой границы первой кнопки
$top=$TabHeight+$TabFormHeight+$CheckCheckHeight; Определение верхней границы певой кнопки
Select ; Создание кнопок
Case $CheckCount=1
$left=$TabFormWidth+$CheckTabWidth;
$SelAll=GUICtrlCreateButton("Выделить все", $left, $top, $CheckWidth, 2*$CheckHeight);
$SelNone=GUICtrlCreateButton("Выделить ничего", $left, $top+2*$CheckHeight+$CheckCheckHeight, $CheckWidth, 2*$CheckHeight);
$Default=GUICtrlCreateButton("По умолчанию", $left, $top+2*(2*$CheckHeight+$CheckCheckHeight), $CheckWidth, 2*$CheckHeight);
$Install=GUICtrlCreateButton("Установить", $left, $top+3*(2*$CheckHeight+$CheckCheckHeight), $CheckWidth, 2*$CheckHeight);
Case $CheckCount=2
$left=$TabFormWidth+$CheckTabWidth;
$SelAll=GUICtrlCreateButton("Выделить все", $left, $top, $CheckWidth, 2*$CheckHeight);
$SelNone=GUICtrlCreateButton("Выделить ничего", $left+$CheckCheckWidth+$CheckWidth, $top, $CheckWidth, 2*$CheckHeight);
$Default=GUICtrlCreateButton("По умолчанию", $left, $top+2*$CheckHeight+$CheckCheckHeight, $CheckWidth, 2*$CheckHeight);
$Install=GUICtrlCreateButton("Установить", $left+$CheckCheckWidth+$CheckWidth, $top+2*$CheckHeight+$CheckCheckHeight, $CheckWidth, 2*$CheckHeight);
Case $CheckCount=3
$left=$TabFormWidth+$CheckTabWidth;
$SelAll=GUICtrlCreateButton("Выделить все", $left, $top, $CheckWidth, 2*$CheckHeight);
$SelNone=GUICtrlCreateButton("Выделить ничего", $left+$CheckCheckWidth+$CheckWidth, $top, $CheckWidth, 2*$CheckHeight);
$Default=GUICtrlCreateButton("По умолчанию", $left+2*($CheckCheckWidth+$CheckWidth), $top, $CheckWidth, 2*$CheckHeight);
$Install=GUICtrlCreateButton("Установить", $left+$CheckCheckWidth+$CheckWidth, $top+2*$CheckHeight+$CheckCheckHeight, $CheckWidth, 2*$CheckHeight);
Case $CheckCount>3
$SelAll=GUICtrlCreateButton("Выделить все", $FormWidth-($left+$CheckWidth+3*($CheckCheckWidth+$CheckWidth)), $top, $CheckWidth, 2*$CheckHeight);
$SelNone=GUICtrlCreateButton("Выделить ничего", $FormWidth-($left+$CheckWidth+2*($CheckCheckWidth+$CheckWidth)), $top, $CheckWidth, 2*$CheckHeight);
$Default=GUICtrlCreateButton("По умолчанию", $FormWidth-($left+$CheckWidth+$CheckCheckWidth+$CheckWidth), $top, $CheckWidth, 2*$CheckHeight);
$Install=GUICtrlCreateButton("Установить", $FormWidth-($left+$CheckWidth), $top, $CheckWidth, 2*$CheckHeight);
EndSelect;
GUISetState (@SW_SHOW); Показываем форму
SetDef($Check, $Ins, $Def, $CheckBox); Расставляем галочки
Dim $figure = "merlin", $Char, $AgentControl;
LoadChar($figure, $Char, $AgentControl);
$Char.MoveTo(900,615);
$Char.Show;
$Char.Play("Greet");
$Char.Speak("Здраствуйте.");
$Char.Play("RestPose");
$Char.Speak("Вы запустили " & $Title & ". ");
$Char.Speak("Выберите устанавливаемые программы. ");
$Char.Speak("Нажмите Установить и подождите окончания установки программ.");
$Char.Speak("Я исчезну, когда установка закончится.");
$DoInstall=0;
Dim $ms[UBound($CheckBox)];
Do; Обработка событий нажатий на кнопки
$msg = GUIGetMsg();
Select
Case $msg=$SelAll
For $i=1 to UBound($CheckBox)-1
GUICtrlSetState($CheckBox[$i],$GUI_CHECKED);
Next
Case $msg=$SelNone
For $i=1 to UBound($CheckBox)-1
GUICtrlSetState($CheckBox[$i],$GUI_UNCHECKED);
Next
Case $msg=$Default
SetDef($Check, $Ins, $Def, $CheckBox);
Case $msg=$Install
$msg = $GUI_EVENT_CLOSE;
$DoInstall=1;
For $i=1 to UBound($CheckBox)-1
$ms[$i]=GUICtrlRead($CheckBox[$i]);
Next;
EndSelect;
Until $msg = $GUI_EVENT_CLOSE;
GUISetState(@SW_HIDE); Скрываем форму
If $DoInstall=1 Then; Собственно сама установка
For $i=1 To UBound($CheckBox)-1
For $j=1 To UBound($CheckBox)-1
If ($Ins[$i]=$Check[$j]) And ($ms[$j]=1) Then
;$Char.Speak("Началась установка " & GetFolder($Ins));
if FileExists($Check[$j] & "\setup.exe") Then RunWait($Check[$j] & "\setup.exe");
EndIf;
Next;
Next;
EndIf;
UnLoadChar($figure, $Char, $AgentControl); Выгрузка помощника
Exit
Func OpenDefault(ByRef $Ins, ByRef $Def, $str);
$msg="";
$n=_FileCountLines($str);
$f=FileOpen($str,0);
For $i=1 To $n/2
$a=FileReadLine($f, 2*$i-1);
If Not FileExists($a & "\setup.exe") Then $msg=$msg & "Not found: " & $a & @CRLF;
$b=FileReadLine($f, 2*$i);
_ArrayAdd($Ins, $a);
_ArrayAdd($Def, $b);
Next;
FileClose($f);
If StringLen($msg)>0 Then MsgBox(16, "Error!", $msg);
EndFunc;
Func OpenPanels(ByRef $Pan, ByRef $Check, ByRef $Count, $str);
$Count[0]=0;
$n=_FileCountLines($str);
$f=FileOpen($str, 0);
For $i=1 To $n
$a=FileReadLine($f, $i);
$j=StringInStr($a, ";");
If $j=1 Then
_ArrayAdd($Pan, StringRight($a,StringLen($a)-1));
_ArrayAdd($Count, UBound($Check));
Else
_ArrayAdd($Check, $a);
EndIf;
Next;
_ArrayAdd($Count, UBound($Check));
EndFunc;
Func GetHex($str, ByRef $name, ByRef $val);
$i=StringInStr($str, "=");
$name=StringLeft($str, $i-1);
$val=StringRight($str, StringLen($str)-$i);
EndFunc;
Func OpenSettings(ByRef $CheckCount, ByRef $CheckHeight, ByRef $CheckWidth, ByRef $CheckCheckWidth, ByRef $CheckCheckHeight, ByRef $CheckTabHeight, ByRef $CheckTabWidth, ByRef $TabFormHeight, ByRef $TabFormWidth, $str);
Dim $name, $val;
$n=_FileCountLines($str);
$f=FileOpen($str, 0);
For $i=1 To $n
$a=FileReadLine($f, $i);
If (StringInStr($a, ";")=0) And (StringIsSpace($a)=0) Then
GetHex($a, $name, $val);
Select
Case $name="CheckCount"
$CheckCount=$val;
Case $name="CheckHeight"
$CheckHeight=$val;
Case $name="CheckWidth"
$CheckWidth=$val;
Case $name="CheckCheckWidth"
$CheckCheckWidth=$val;
Case $name="CheckCheckHeight"
$CheckCheckHeight=$val;
Case $name="CheckTabHeight"
$CheckTabHeight=$val;
Case $name="CheckTabWidth"
$CheckTabWidth=$val;
Case $name="TabForm"
$TabForm=$val;
Case $name="TabFormHeight"
$TabFormHeight=$val;
Case $name="TabFormWidth"
$TabFormWidth=$val;
Case Else
Sleep(10);
EndSelect;
EndIf;
Next;
EndFunc;
Func Load($str);
$n=_FileCountLines($str);
$f=FileOpen($str, 0);
$b=FileReadLine($f, 1);
For $i=2 To $n
$b=StringFormat("%s%s%s", $b, @CRLF, FileReadLine($f, $i));
Next;
Return $b;
EndFunc;
Func Div($a, $b);
Return ($a-Mod($a, $b))/$b;
EndFunc;
Func GetMaxCheck($Count, $CheckCount);
$n=0;
For $i=1 To UBound($Count)-1
If $n<$Count[$i]-$Count[$i-1] Then
$n=$Count[$i]-$Count[$i-1];
EndIf;
Next;
If Mod($n, $CheckCount)=0 Then
$n=Div($n, $CheckCount);
Else
$n=Div($n, $CheckCount)+1;
EndIf;
Return $n;
EndFunc;
Func GetDef($name, $Ins, $Def);
For $i=1 To UBound($Ins)-1
If StringInStr($name, $Ins[$i])<>0 Then
Return $Def[$i];
EndIf
Next
EndFunc;
Func GetFolder($name);
$n=StringInStr($name, "\");
$str=StringRight($name, StringLen($name)-$n);
While StringInStr($str, "\")<>0
$n=StringInStr($str, "\");
$str=StringRight($str, StringLen($str)-$n);
WEnd;
Return $str;
EndFunc;
Func SetDef($Check, $Ins, $Def, $CheckBox);
For $i=1 To UBound($Check)-1
If StringInStr(StringLower(GetDef($Check[$i], $Ins, $Def)),"true")<>0 Then
GUICtrlSetState($CheckBox[$i],$GUI_CHECKED);
EndIf;
Next;
EndFunc;
Func LoadChar($figure, ByRef $Char, ByRef $AgentControl);
Opt("ExpandEnvStrings", 1);
$Path = "%WINDIR%\MSAGENT\CHARS\" & $figure & ".ACS";
$AgentControl = ObjCreate("Agent.Control.1");
$SinkObject=ObjEvent($AgentControl, "event_");
If Isobj($AgentControl) Then $AgentControl.Connected = True;
$AgentControl.Characters.Load($figure, $Path) ;
$Char = $AgentControl.Characters($figure);
EndFunc;
Func UnLoadChar($figure, ByRef $Char, ByRef $AgentControl);
;$Char.Play("Exit");
$Char.Play("Greet");
;$Char.Speak("Изволю откланяться.");
$Char.Play("RestPose");
Sleep(1500);
$Char.Hide;
$Char.StopAll;
$AgentControl.Characters.Unload($figure);
EndFunc;
[/more]
[more=Файл Panels.ini]
;CD
CD\ReCD\Ahead Nero7
CD\ReCD\UltraISO 8.00.139
;DirectX
DirectX
;Drivers
Drivers\NVidia 2.03 WinXP
Drivers\Realtek Audio v3.51
Drivers\Sven Multimedia 800
;Архиваторы
Архиваторы\WinRAR 3.51
;Кодеки
Кодеки\ACE MegaCoDecSPack 6.00
Кодеки\VP
;Музыка
Музыка\QCD
Музыка\WinAmp
;Офисные программы
Офисные программы\OFFICE 2003 RUS
Офисные программы\Notepad++ 3.8
;Настройка системы
Tweaker\TweakXP Pro 4.0.6
System Updates & Utils\Русский
;Сети
Сети\Brousers\Opera 9.0
Сети\Интернет скачка файлов\Teleport Pro 1.42
Сети\Почта\Thunderbird 1.5
;Другое
PDFCreator 0.9.0
Punto Switcher 2.8
Uninstall Tool 1.6
[/more]
[more=Файл Default.ini]
Офисные программы\OFFICE 2003 RUS
true
Офисные программы\Notepad++ 3.8
true
Drivers\NVidia 2.03 WinXP
true
Drivers\Realtek Audio v3.51
true
Drivers\Sven Multimedia 800
true
Кодеки\ACE MegaCoDecSPack 6.00
true
Кодеки\VP
true
CD\ReCD\Ahead Nero7
true
DirectX
true
Музыка\QCD
true
Музыка\WinAmp
true
Архиваторы\WinRAR 3.51
true
Uninstall Tool 1.6
true
Сети\Интернет скачка файлов\Teleport Pro 1.42
true
System Updates & Utils\Русский
true
Сети\Brousers\Opera 9.0
true
Сети\Почта\Thunderbird 1.5
true
Tweaker\TweakXP Pro 4.0.6
true
Punto Switcher 2.8
true
PDFCreator 0.9.0
true
CD\ReCD\UltraISO 8.00.139
true
[/more]
[more=Файл Settings.ini]
;Количество столбцов флажков
CheckCount=2
;Высота флажков
CheckHeight=15
;Ширина флажков
CheckWidth=200
;Расстояние между флажками по горизонтали
CheckCheckWidth=10
;Расстояние между флажками по вертикали
CheckCheckHeight=10
;расстояние между флажком и панелью по горизонтали
CheckTabWidth=15
;расстояние между флажком и панелью по вертикали
CheckTabHeight=23
;Расстояние между панелью и краем формы по горизонтали
TabFormWidth=15
;Расстояние между панелью и краем формы по вертикали
TabFormHeight=15
[/more]