Возвращаясь к вопросу об оболочке. 
 Я написал простенькую. Прошу не судить строго. Я, правда, позаимствовал кусочек кода у 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]