Jump to content

This site uses cookies. By continuing to browse the site you are agreeing to our use of cookies. Find out more here. X
X


Photo

The Vollatran Project - Application Installer tool

multiple installer software installer batch installer application installer

  • Please log in to reply
19 replies to this topic

#1 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 04 October 2011 - 01:43 PM

The Vollatran Project - Application Installer tool

I've been running a PM thread for a while for a script that performs batch type application installs on PCs. I'm not the original author of the script (My hat goes off to Kennedy for the original work!) but I have taken his wonderful work and tweaked it to my needs.

Screenshot example:

install_screenshot.JPG

Version of AutoIt required: 3.3.6.1. (or later)

Main Script:
AutoIt         
;Notes: I'm not the original writer of this code. I have taken the code and made changes to it to suit ;my purposes as well as maintaining it. The original writer is Kennedy. #include <file.au3> Opt("ExpandEnvStrings", 1) ;test Opt("TrayIconDebug", 1) Dim $Ver ;OS Version Dim $OS ;OS Version in more readable format ReturnOSVersion() _inicheck() ;if the INI for the OS is missing the script will error then exit Dim $InstallFile = @ScriptDir & "\config\" & $Ver & ".ini" ;default install file Dim $LogFile = IniRead(@ScriptDir & "\config\config.ini", "config", "LogFilePath", @TempDir) & "\Install_History\Install-" & @ComputerName & ".txt" Dim $Log = IniRead(@ScriptDir & "\config\config.ini", "config", "LogFile", "1") Dim $settings = "\config\config.ini" Dim $AvailableArray[1][1] ;array with all commands Dim $SelectedArray[1][1] ;array with commands to run Dim $Available ;list with all sections Dim $Selected ;list with selected sections Dim $DefaultProfile = "(none)" ;profile selected by default Dim $ProfilesList = "" ;list of all profiles Dim $SelectedProfile = "" ;currently selected profile Dim $Profile = "" ;profile to use in silent run Dim $Silent = 0 ;is it silent run? Dim $ForceGUI = 0 ;show GUI for non-standart file? Dim $Reboot = 1 ;reboot mode Dim $AutoLogon = 0 ;autologon selected? Dim $RebootCount = 0 ;number of reboots required Dim $Flag ;default flag for installation If IniRead(@ScriptDir & "\config\config.ini", "config", "WindowMode", "Minimize") = "Minimize" Then $Flag = @SW_MINIMIZE If IniRead(@ScriptDir & "\config\config.ini", "config", "WindowMode", "Minimize") = "Maximize" Then $Flag = @SW_MAXIMIZE If IniRead(@ScriptDir & "\config\config.ini", "config", "WindowMode", "Minimize") = "Hide" Then $Flag = @SW_HIDE Dim $NonSelectable = IniRead(@ScriptDir & "\config\config.ini", "config", "NonSelectable", "") Dim $RebootTimer = IniRead(@ScriptDir & "\config\config.ini", "config", "RebootTimer", "60") Dim $AdminWarning = IniRead(@ScriptDir & "\config\config.ini", "config", "AdminWarning", "1") Dim $ProgressType = IniRead(@ScriptDir & "\config\config.ini", "config", "ProgressType", "2") Dim $Logging = IniRead(@ScriptDir & "\config\config.ini", "config", "Logging", "1") Dim $Append = "" ;path to append to commands   Dim $Description ;description for Progress2 items Dim $Context ;context for Progress2 Dim $SoftwareToInstall = 0 Dim $Subcommands = 0 Dim $CurrentSubCommand = 0 Dim $LabelDescription, $ProgressSubItems, $ProgressItem1, $ProgressItem2 ;;;;;;;;;;;;; ;MAIN If $AdminWarning = 1 Then CheckAdmin() CommandLine() FileToArray($AvailableArray, $InstallFile) If $Silent = 1 And $ForceGUI = 0 Then If $Profile <> "" Then   $Selected = IniRead($InstallFile, "Profiles", $Profile, "") Else   $Selected = $Available EndIf Else ReturnOSVersion() GUI() GUIDelete() EndIf ReadSelection() Install() GUIDelete() If $Reboot > 1 Then Reboot($RebootTimer) ;;;;;;;;;;;;; ;done Func ReturnOSVersion() ;Get OS version to readable format $Ver = @OSVersion Select   Case $Ver = "WIN_7"    If @OSArch = "X86" then     $Ver = "WIN_7_32"     $OS = "Windows 7 - 32Bit  "    EndIf    If @OSArch = "X64" then     $Ver = "WIN_7_64"     $OS = "Windows 7 - 64Bit  "    EndIf   Case $Ver = "WIN_2008R2"    $OS = "Windows Server 2008"   Case $Ver = "WIN_VISTA"    $OS = "Windows Vista"   Case $Ver = "WIN_2003"    $OS = "Windows Server 2003"   Case $Ver = "WIN_XP"    If @OSArch = "X86" then     $Ver = "WIN_XP_32"     $OS = "Windows XP - 32Bit  "    EndIf    If @OSArch = "X64" then     $Ver = "WIN_XP_64"     $OS = "Windows XP - 64Bit  "    EndIf   Case $Ver = "WIN_2000"    $OS = "Windows 2000"   Case $Ver = "WIN_98"    $OS = "Windows 98"   Case $Ver = "WIN_ME"    $OS = "Windows ME"   Case $Ver = "WIN_95"    $OS = "Windows 95"   Case $Ver = "WIN_NT4"    $OS = "Windows NT4" EndSelect EndFunc   ;==>ReturnOSVersion ;done Func CommandLine() ; Read command line options For $i = 1 To UBound($CmdLine) - 1   Select    Case $CmdLine[$i] = "?" Or $CmdLine[$i] = "/?" Or $CmdLine[$i] = "help" Or $CmdLine[$i] = "/help"     MsgBox(0, "Help", "/? - Displays this message" & @LF & _       "filename     - Specify file to read instructions from (Silent mode)" & @LF & _       "                     You can create such files in GUI mode" & @LF & _       "/GUI              Forces GUI mode" & @LF & _       "Profile             Profile to use" & @LF & _       "reboot            0 - Disable restarting the computer" & @LF & _       "                     1 - Enable restarting the computer (default)" & @LF & _       "                     2 - Disable but restart when finished" & @LF & _       "                     3 - Enable and restart when finished" & @LF & @LF & _       "Example:" & @LF & _       "   VollatranInstall.exe c:\VollatranInstall.ini 2")     Exit    Case StringIsDigit($CmdLine[$i])     Select      Case $CmdLine[$i] = 0       $Reboot = 0      Case $CmdLine[$i] = 1       $Reboot = 1      Case $CmdLine[$i] = 2       $Reboot = 2      Case $CmdLine[$i] = 3       $Reboot = 3     EndSelect    Case $CmdLine[$i] = "/GUI"     $ForceGUI = 1    Case StringRight($CmdLine[$i], 4) = ".ini"     $InstallFile = $CmdLine[$i]     $Silent = 1    Case Else     $Profile = $CmdLine[$i]   EndSelect Next EndFunc   ;==>CommandLine ;done Func Reboot($tSeconds) ;Reboot computer ProgressOn("Restarting", IniRead(@ScriptDir & "\config\config.ini", "Language", "Restarting", "Restarting"), "", -1, -1, 16) For $i = $tSeconds To 0 Step -1   Sleep(1000)   ProgressSet((($tSeconds - $i) * 100) / $tSeconds, $i & " seconds") Next Shutdown(6) EndFunc   ;==>Reboot ;done Func CheckAdmin() ;Check if user has administrator rights If IsAdmin() = 0 Then   If MsgBox(4, "", "Administrator rights required. Continue?") = 7 Then Exit EndIf EndFunc   ;==>CheckAdmin ;done Func FileToArray(ByRef $tArray, $tFile) ;Write all commands to array $i = 0 $ProfilesList = IniRead($tFile, "Config", "Profiles", "") $ProfilesList = $ProfilesList & "|All|(none)" $DefaultProfile = IniRead($tFile, "Config", "DefaultProfile", "(none)") $Append = IniRead($tFile, "Config", "Append", "") If $Append = "CD" Then $Append = @ScriptDir & "\" $tOpenFile = FileOpen($tFile, 0) While 1   $tLine = FileReadLine($tOpenFile)   If @error = -1 Then ExitLoop   $tLine = StringStripWS($tLine, 3)   Select    Case StringLeft($tLine, 1) = "["     If StringLeft($tLine, 8) <> "[Config]" And StringLeft($tLine, 10) <> "[Profiles]" Then      FillArray($tArray, $tLine, "Section", $i)      $tArray[$i - 1][0] = StringReplace($tArray[$i - 1][0], "[", "")      $tArray[$i - 1][0] = StringReplace($tArray[$i - 1][0], "]", "")      $Available = $Available & "|" & $tArray[$i - 1][0]     EndIf    Case StringLeft($tLine, 7) = "RunWait"     FillArray($tArray, $tLine, "RunWait", $i)    Case StringLeft($tLine, 3) = "Run"     FillArray($tArray, $tLine, "Run", $i)    Case StringLeft($tLine, 3) = "MSI"     FillArray($tArray, $tLine, "MSI", $i)    Case StringLeft($tLine, 3) = "DOS"     FillArray($tArray, $tLine, "DOS", $i)    Case StringLeft($tLine, 3) = "REG"     FillArray($tArray, $tLine, "REG", $i)    Case StringLeft($tLine, 11) = "WaitProcess"     FillArray($tArray, $tLine, "WaitProcess", $i)    Case StringLeft($tLine, 12) = "WinWaitClose"     FillArray($tArray, $tLine, "WinWaitClose", $i)    Case StringLeft($tLine, 6) = "Reboot"     FillArray($tArray, $tLine, "Reboot", $i)    Case StringLeft($tLine, 13) = "FolderCommand"     FillArray($tArray, $tLine, "FolderCommand", $i)    Case StringLeft($tLine, 11) = "FolderFiles"     FillArray($tArray, $tLine, "FolderFiles", $i)    Case StringLeft($tLine, 12) = "FolderSwitch"     FillArray($tArray, $tLine, "FolderSwitch", $i)    Case StringLeft($tLine, 6) = "Folder"     FillArray($tArray, $tLine, "Folder", $i)    Case StringLeft($tLine, 16) = "FileExistVersion"     FillArray($tArray, $tLine, "FileExistVersion", $i)    Case StringLeft($tLine, 15) = "FileExistAction"     FillArray($tArray, $tLine, "FileExistAction", $i)    Case StringLeft($tLine, 9) = "FileExist"     FillArray($tArray, $tLine, "FileExist", $i)    Case StringLeft($tLine, 18) = "FileNotExistAction"     FillArray($tArray, $tLine, "FileNotExistAction", $i)    Case StringLeft($tLine, 12) = "FileNotExist"     FillArray($tArray, $tLine, "FileNotExist", $i)    Case StringLeft($tLine, 11) = "Description"     FillArray($tArray, $tLine, "Description", $i)    Case StringLeft($tLine, 7) = "Context"     FillArray($tArray, $tLine, "Context", $i)    Case Else   EndSelect WEnd FileClose($tOpenFile) EndFunc   ;==>FileToArray ;done Func FillArray(ByRef $tArray, $tLine, $tCommand, ByRef $tCounter) ReDim $tArray[$tCounter + 1][2] $tPos = StringInStr($tLine, "=") $tLine = StringTrimLeft($tLine, $tPos) $tLine = StringStripWS($tLine, 3) $tArray[$tCounter][0] = $tLine $tArray[$tCounter][1] = $tCommand $tCounter = $tCounter + 1 EndFunc   ;==>FillArray ;done Func DelFromList(ByRef $tList, $tItem) $tList = StringReplace($tList & "|", "|" & $tItem & "|", "|") $tList = StringTrimRight($tList, 1) EndFunc   ;==>DelFromList ;done Func CheckList($tString, $tSubstring) ; Check if substring is in the list $tString = $tString & "|" If StringInStr($tString, "|" & $tSubstring & "|") > 0 Then   Return 1 Else   Return 0 EndIf EndFunc   ;==>CheckList ;done Func ReadSelection() $tSelected = "" $Subcommands = 0 $SoftwareToInstall = 0 $tNumber = UBound($AvailableArray) $j = 1 $tTriger = 0 For $i = 0 To $tNumber - 1   If $AvailableArray[$i][1] = "Section" Then    If CheckList($Selected, $AvailableArray[$i][0]) = 1 Then     $SoftwareToInstall = $SoftwareToInstall + 1     $tTriger = 1     $tSelected = $tSelected & "|" & $AvailableArray[$i][0]    Else     $tTriger = 0    EndIf   EndIf   If $tTriger = 1 Then    ReDim $SelectedArray[$j][2]    $SelectedArray[$j - 1][0] = $AvailableArray[$i][0]    $SelectedArray[$j - 1][1] = $AvailableArray[$i][1]    If $AvailableArray[$i][1] = "Reboot" Then $RebootCount = $RebootCount + 1    $j = $j + 1   EndIf Next $Selected = $tSelected EndFunc   ;==>ReadSelection ;done Func FindNextSection($tArray, $tCounter) For $i = $tCounter To UBound($tArray) - 1   If $tArray[$i][1] = "Section" Then Return $i Next Return -1 EndFunc   ;==>FindNextSection ;done Func CountFiles($tFolder, $tFileType) $i = 0 $tFile = FileFindFirstFile($tFolder & "\*." & $tFileType) If $tFile = -1 Then   Return 0 EndIf While 1   $tNextFile = FileFindNextFile($tFile)   If @error Then Return $i   $i = $i + 1 WEnd EndFunc   ;==>CountFiles ;done Func GUI() $gui1 = GUICreate("Vollatran - " & $OS & " " & @OSServicePack, 510, 455) GUICtrlCreateTab(0, 0, 510, 455) GUICtrlCreateTabItem("Available Software") GUICtrlCreateLabel(IniRead(@ScriptDir & "\config\config.ini", "Language", "Available", "Available Programs"), 20, 30, 160, 20) GUICtrlSetFont(-1, 12, 646) GUICtrlCreateLabel(IniRead(@ScriptDir & "\config\config.ini", "Language", "Selected", "Selected Programs"), 210, 30, 160, 20) GUICtrlSetFont(-1, 12, 646) GUICtrlCreateLabel(@YEAR&" VP", 390, 420, 160, 20) $ListAvailable = GUICtrlCreateList("", 10, 50, 180, 400, 0x00a00001) GUICtrlSetData(-1, $Available) GUICtrlSetTip(-1, "Click on item to select it") $ListSelected = GUICtrlCreateList("", 200, 50, 180, 400, 0x00a00001) $Selected = IniRead($InstallFile, "Profiles", $DefaultProfile, "") GUICtrlSetData(-1, $Selected) GUICtrlSetTip(-1, "Click on item to remove it") $ButtonStart = GUICtrlCreateButton(IniRead(@ScriptDir & "\config\config.ini", "Language", "Start", "Start"), 390, 380, 110, 25, 0x0001) GUICtrlSetTip(-1, "Start Installation") $ComboProfiles = GUICtrlCreateCombo("", 390, 50, 110, 30, 0x00200142) GUICtrlSetData(-1, $ProfilesList, $DefaultProfile) GUICtrlSetTip(-1, "Select Profile to use") $ButtonSaveProf = GUICtrlCreateButton(IniRead(@ScriptDir & "\config\config.ini", "Language", "SaveProfile", "Save Profile"), 390, 80, 110, 25) GUICtrlSetTip(-1, "Save/Update selected profile") $ButtonDelProf = GUICtrlCreateButton(IniRead(@ScriptDir & "\config\config.ini", "Language", "DeleteProfile", "Delete Profile"), 390, 110, 110, 25) GUICtrlSetTip(-1, "Delete selected profile") $ButtonClear = GUICtrlCreateButton(IniRead(@ScriptDir & "\config\config.ini", "Language", "Clear", "Clear"), 390, 140, 110, 25) GUICtrlSetTip(-1, "Remove all selected items from list") $CheckReboot = GUICtrlCreateCheckbox(IniRead(@ScriptDir & "\config\config.ini", "Language", "Reboot", "Reboot"), 410, 305, 90, 20) GUICtrlSetTip(-1, "Reboot when finished") $CheckAutoLog = GUICtrlCreateCheckbox(IniRead(@ScriptDir & "\config\config.ini", "Language", "Autologon", "Autologon"), 410, 325, 90, 20) GUICtrlSetTip(-1, "Enable autologon") $ButtonSaveFile = GUICtrlCreateButton(IniRead(@ScriptDir & "\config\config.ini", "Language", "SaveToFile", "Save To File"), 390, 350, 110, 25) GUICtrlSetTip(-1, "Save selection to file") $logo1 = IniRead(@ScriptDir & $settings, "logo", "pic1", "") $logo2 = IniRead(@ScriptDir & $settings, "logo", "pic2", "") If $logo1 = "" Then   ConsoleWrite('line: '&@ScriptLineNumber & ':'&@crlf&'GUICtrlCreatePic(@ScriptDir & $logo1, 390, 170, 110, 60) = You will need to insert pic to make it apppear'&@crlf) ;### Debug Console   GUICtrlCreateLabel("No Logo defined. Edit config.ini> [logo]> pic1 to add logo", 390, 170, 110, 60) Else   GUICtrlCreatePic(@ScriptDir & $logo1, 390, 170, 110, 60) EndIf If $logo2 = "" Then   ConsoleWrite('line: '&@ScriptLineNumber & ':'&@crlf&'GUICtrlCreatePic(@ScriptDir & $logo2, 390, 240, 110, 60) = You will need to insert pic to make it apppear'&@crlf) ;### Debug Console      GUICtrlCreateLabel("No Logo defined. Edit config.ini> [logo]> pic2 to add logo", 390, 240, 110, 60) Else   GUICtrlCreatePic(@ScriptDir & $logo2, 390, 240, 110, 60) EndIf ;~  GUICtrlCreateTabItem("Currently Installed Software") ;~  ;Will use Big_daddy's code here to build section ;~ ;~  GUICtrlCreateTabItem("System Information") ;~  ;will need to research ;~ ;~  GUICtrlCreateTabItem("Log files") ;~  ;All logs will be here. Have buttons to open new child windows. ;~ ;~  GUICtrlCreateTabItem("Settings") ;~  ;All settings that are contained in config file will be controled here. ;~  ; GUISetState(@SW_SHOW, $gui1) While 1   $msg = GUIGetMsg()   Select    Case $msg = -3     Exit    Case $msg = $ListAvailable     $tItem = GUICtrlRead($ListAvailable)     If $tItem <> "" And StringLeft($tItem, 1) <> $NonSelectable Then      If CheckList($Selected, $tItem) = 0 Then       $Selected = $Selected & "|" & $tItem       GUICtrlSetData($ListSelected, $Selected)      EndIf     EndIf    Case $msg = $ListSelected     $tItem = GUICtrlRead($ListSelected)     If $tItem <> "" Then      $tString = $Selected & "|"      $tString = StringReplace($tString, "|" & $tItem & "|", "|")      $Selected = StringTrimRight($tString, 1)      GUICtrlSetData($ListSelected, $Selected)     EndIf    Case $msg = $ButtonStart     ExitLoop    Case $msg = $ComboProfiles     $SelectedProfile = GUICtrlRead($ComboProfiles)     Select      Case $SelectedProfile = "(none)"       $Selected = ""       GUICtrlSetData($ListSelected, $Selected)      Case $SelectedProfile = "All"       $Selected = ""       $tArray = StringSplit($Available, "|")       For $i = 1 To $tArray[0]        If $tArray[$i] <> "" And StringLeft($tArray[$i], 1) <> $NonSelectable Then         $Selected = $Selected & "|" & $tArray[$i]        EndIf       Next       GUICtrlSetData($ListSelected, $Selected)      Case Else       $Selected = IniRead($InstallFile, "Profiles", $SelectedProfile, "")       GUICtrlSetData($ListSelected, $Selected)     EndSelect    Case $msg = $ButtonSaveProf     $tItem = GUICtrlRead($ComboProfiles)     If StringIsDigit($tItem) = 1 Then      MsgBox(0, "", "Profile name can't be a number")      ContinueLoop     EndIf     If $tItem <> "(none)" And $tItem <> "All" And StringStripWS($tItem, 3) <> "" Then      If CheckList($ProfilesList, $tItem) = 0 Then       $ProfilesList = $ProfilesList & "|" & $tItem       $tString = $ProfilesList       DelFromList($tString, "(none)")       DelFromList($tString, "All")       IniWrite($InstallFile, "Config", "Profiles", $tString)      EndIf      IniWrite($InstallFile, "Profiles", $tItem, $Selected)      GUICtrlSetData($ComboProfiles, "")      GUICtrlSetData($ComboProfiles, $ProfilesList, $tItem)     EndIf    Case $msg = $ButtonDelProf     $tItem = GUICtrlRead($ComboProfiles)     If $tItem <> "(none)" And $tItem <> "All" And StringStripWS($tItem, 3) <> "" Then      DelFromList($ProfilesList, $tItem)      $tString = $ProfilesList      DelFromList($tString, "(none)")      DelFromList($tString, "All")      IniWrite($InstallFile, "Config", "Profiles", $tString)      IniDelete($InstallFile, "Profiles", $tItem)      GUICtrlSetData($ComboProfiles, "")      GUICtrlSetData($ComboProfiles, $ProfilesList)     EndIf    Case $msg = $ButtonClear     $Selected = ""     GUICtrlSetData($ListSelected, $Selected)    Case $msg = $CheckReboot     If $Reboot < 2 Then      $Reboot = $Reboot + 2     ElseIf $Reboot > 1 Then      $Reboot = $Reboot - 2     EndIf    Case $msg = $CheckAutoLog     If $AutoLogon = 0 Then      $AutoLogon = 1     ElseIf $AutoLogon = 1 Then      $AutoLogon = 0     EndIf    Case $msg = $ButtonSaveFile     ReadSelection()     GUICtrlSetData($ListSelected, $Selected)     SaveToFile("", 0)    Case Else   EndSelect WEnd EndFunc   ;==>GUI ;win other Func AutoLogon() ;Write autologon information to registry If $Ver = "WIN_XP_32" Or $Ver = "WIN_XP_64" Or $Ver = "WIN_2000" Or $Ver = "WIN_NT4" Then   ; ------------------------------------------------------------------------------------------------------- ; Note - I added support for 32 bit and 64 bit Windows XP. However I'm not able to test on all Operating systems. ;you will need to verify on your OS that the below RegWrite paths are correct. If not correct for your OS ; then you will need to make a new IF statement to cover the paths you need.     RegWrite("HKLM\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\", "DefaultUserName", "REG_SZ", @UserName)   $Password = InputBox("Password", "Enter password for autologon" & @CR & $RebootCount & " restart(s) required", "", "*")   RegWrite("HKLM\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\", "DefaultPassword", "REG_SZ", $Password)   RegWrite("HKLM\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\", "AutoAdminLogon", "REG_SZ", "1")   RegWrite("HKLM\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\", "AutoLogonCount", "REG_DWORD", $RebootCount)   RegWrite("HKLM\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\", "DefaultDomainName", "REG_SZ", @LogonDomain) EndIf If $Ver = "WIN_98" Or $Ver = "WIN_95" Or $Ver = "WIN_ME" Then   MsgBox(0, "", "Autologon currently not avialable for " & $OS) EndIf EndFunc   ;==>AutoLogon ;done Func FindNumberOfSubcommands($tCounter) $tSubCommands = 0 For $i = $tCounter To UBound($SelectedArray) - 1   If $SelectedArray[$i][1] = "Section" Or $i = UBound($SelectedArray) - 1 Then    Return $tSubCommands   EndIf   If $SelectedArray[$i][1] = "Run" Or $SelectedArray[$i][1] = "RunWait" Or $SelectedArray[$i][1] = "DOS" Or _     $SelectedArray[$i][1] = "MSI" Or $SelectedArray[$i][1] = "REG" Or $SelectedArray[$i][1] = "WaitProcess" Then    $tSubCommands = $tSubCommands + 1   EndIf   If $SelectedArray[$i][1] = "Folder" Then    If $SelectedArray[$i + 1][1] = "FolderFiles" Then     $tSubCommands = $tSubCommands + CountFiles($SelectedArray[$i][0], $SelectedArray[$i + 1][0])    ElseIf $SelectedArray[$i + 2][1] = "FolderFiles" Then     $tSubCommands = $tSubCommands + CountFiles($SelectedArray[$i][0], $SelectedArray[$i + 2][0])    ElseIf $SelectedArray[$i + 3][1] = "FolderFiles" Then     $tSubCommands = $tSubCommands + CountFiles($SelectedArray[$i][0], $SelectedArray[$i + 3][0])    EndIf   EndIf Next Return 0 EndFunc   ;==>FindNumberOfSubcommands ;done Func WriteLog($tType, $tCommandType, $tCommand, $tError) Select   Case $tType = 1    FileWriteLine($LogFile, "   " & @HOUR & ":" & @MIN & ":" & @SEC & " Start " & $tCommandType & " = " & $tCommand)   Case $tType = 2    If $tError = 1 Then     FileWriteLine($LogFile, "!!!Error executing command!!!")    EndIf    FileWriteLine($LogFile, "   " & @HOUR & ":" & @MIN & ":" & @SEC & " End   " & $tCommandType & " = " & $tCommand)   Case $tType = 0    FileWriteLine($LogFile, @YEAR & ":" & @MON & ":" & @MDAY & " Installation started")   Case $tType = 3    FileWriteLine($LogFile, @YEAR & ":" & @MON & ":" & @MDAY & " Installation finished")   Case $tType = 4    FileWriteLine($LogFile, "   " & @HOUR & ":" & @MIN & ":" & @SEC & " Restarting")    FileWriteLine($LogFile, "")   Case Else EndSelect EndFunc   ;==>WriteLog ;done Func Fileexist($tCondition, $tName, $tVersion) $tTrue = 0 If $tCondition = 0 Then   If FileExists($tName) = 1 Then    Return 0   Else    Return 1   EndIf EndIf If $tCondition = 1 Then   If FileExists($tName) = 1 Then    If $tVersion = "" Then     Return 1    Else     $tEq = 0     If StringInStr("<=>", StringLeft($tVersion, 1)) > 0 Then      $tEq = 2 ^ StringInStr("<=>", StringLeft($tVersion, 1))      $tVersion = StringTrimLeft($tVersion, 1)     EndIf     If StringInStr("<=>", StringLeft($tVersion, 1)) > 0 Then      $tEq = $tEq + (2 ^ StringInStr("<=>", StringLeft($tVersion, 1)))      $tVersion = StringTrimLeft($tVersion, 1)     EndIf     Select      Case $tEq = 2       Return (FileGetVersion($tName) < $tVersion)      Case $tEq = 4       Return (FileGetVersion($tName) = $tVersion)      Case $tEq = 8       Return (FileGetVersion($tName) > $tVersion)      Case $tEq = 6       Return (FileGetVersion($tName) <= $tVersion)      Case $tEq = 10       Return (FileGetVersion($tName) <> $tVersion)      Case $tEq = 12       Return (FileGetVersion($tName) >= $tVersion)      Case Else       Return 1     EndSelect    EndIf   EndIf   Return 0 EndIf EndFunc   ;==>Fileexist   Func UpdateProgressBar($tItemStart, $tItemEnd, $tCurrentItem, $tArray, $tArrayItem, $tSubCommands) $j = 1 $k = 0 GUICtrlSetPos($LabelDescription, 60, 1000, 220, 15) GUICtrlSetPos($ProgressSubItems, 30, 1000, 240, 10) For $i = $tItemStart To $tCurrentItem - 1   GUICtrlSetPos($i, 30, 30 + ($j) * 15, 260, 15)   GUICtrlSetFont($i, 10, 400)   GUICtrlSetData($i, $tArray[$tArrayItem + $k])   $k = $k + 1   $j = $j + 1 Next GUICtrlSetPos($tCurrentItem, 30, 30 + ($j) * 15, 260, 25) GUICtrlSetData($tCurrentItem, $tArray[$tArrayItem + $k]) GUICtrlSetFont($tCurrentItem, 11, 646) $k = $k + 1 If $tSubCommands > 2 Then   GUICtrlSetPos($LabelDescription, 60, 30 + ($j + 2) * 15, 220, 20)   GUICtrlSetData($LabelDescription, "test")   GUICtrlSetPos($ProgressSubItems, 30, 35 + ($j + 1) * 15, 240, 10)   GUICtrlSetData($ProgressSubItems, 10)   $j = $j + 3 Else   $j = $j + 1 EndIf For $i = $tCurrentItem + 1 To $tItemEnd   GUICtrlSetPos($i, 30, 35 + ($j) * 15, 260, 15)   GUICtrlSetFont($i, 10, 400)   GUICtrlSetData($i, $tArray[$tArrayItem + $k])   $k = $k + 1   $j = $j + 1 Next EndFunc   ;==>UpdateProgressBar Func SaveToFile($tFile, $tFrom) ;  Write selection to file If $tFile = "" Then   $tFile = FileSaveDialog("title", "c:\", "INI files (*.ini)", 16, "VollatranInstall.ini") EndIf $tOpenFile = FileOpen($tFile, 2) If $tOpenFile = -1 Then   MsgBox(0, "Error", "Unable to open file.")   Return EndIf FileWriteLine($tOpenFile, "[Config]") FileWriteLine($tOpenFile, "Append = " & IniRead($InstallFile, "Config", "Append", "")) For $i = $tFrom To UBound($SelectedArray) - 1   Select    Case $SelectedArray[$i][1] = "Section"     FileWriteLine($tOpenFile, "")     FileWriteLine($tOpenFile, "[" & $SelectedArray[$i][0] & "]")    Case $SelectedArray[$i][1] = "Reboot"     FileWriteLine($tOpenFile, "Reboot")    Case Else     FileWriteLine($tOpenFile, $SelectedArray[$i][1] & " = " & $SelectedArray[$i][0])   EndSelect Next FileClose($tOpenFile) EndFunc   ;==>SaveToFile Func Install() WriteLog(0, 1, 1, 1) Dim $tItems = 0 If $SoftwareToInstall = 0 Then ;check if anything selected   Exit EndIf If $AutoLogon = 1 And $RebootCount > 0 Then AutoLogon() ;   $tContinue = StringSplit ( IniRead (@TempDir & "\VollatranInstall-temp.ini", "Config", "Continue", "" ), "|") ;   $tComtinue[1]; $i ;   $tComtinue[2]; $tSize ;   $tComtinue[3]; $ProgressOwerall ;   $tComtinue[4]; $tCounter ;   $tComtinue[5]; $tPlacehold ;   $tComtinue[6]; $tProgressItem ;   $tComtinue[7]; $LabelContext If $ProgressType = 2 Then   Dim $tSize   Dim $SelectedSections = StringSplit(StringTrimLeft($Selected, 1), "|")   If UBound($SelectedSections) - 1 < 18 Then    $tSize = 15 * (UBound($SelectedSections) - 1)   Else    $tSize = 270   EndIf   GUICreate("Installing Applications", 300, $tSize + 130, 20, 20, -1, 0x00000008)   GUISetFont(10, -1, -1, "Times New Roman")   $PLabel1 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel2 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel3 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel4 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel5 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel6 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel7 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel8 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel9 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel10 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel11 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel12 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel13 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel14 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel15 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel16 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel17 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $PLabel18 = GUICtrlCreateLabel("", 30, 1000, 260, 15)   $Overall = GUICtrlCreateLabel("Overall Progress", 30, $tSize + 105, 260, 25)   GUICtrlSetFont(-1, 10, 646)   $ProgressOverall = GUICtrlCreateProgress(30, $tSize + 85, 240, 20, 0x01)   $LabelContext = GUICtrlCreateLabel("Installing Applications", 10, 10, 260, 20)   GUICtrlSetFont(-1, 12, 646)   Global $LabelDescription = GUICtrlCreateLabel("", 60, 1000, 260, 15)   GUICtrlSetFont(-1, 9, 646)   Global $ProgressSubItems = GUICtrlCreateProgress(30, 1000, 240, 15, 0x01)   Dim $ProgressArray[19]   $ProgressArray[1] = $PLabel1   $ProgressArray[2] = $PLabel2   $ProgressArray[3] = $PLabel3   $ProgressArray[4] = $PLabel4   $ProgressArray[5] = $PLabel5   $ProgressArray[6] = $PLabel6   $ProgressArray[7] = $PLabel7   $ProgressArray[8] = $PLabel8   $ProgressArray[9] = $PLabel9   $ProgressArray[10] = $PLabel10   $ProgressArray[11] = $PLabel11   $ProgressArray[12] = $PLabel12   $ProgressArray[13] = $PLabel13   $ProgressArray[14] = $PLabel14   $ProgressArray[15] = $PLabel15   $ProgressArray[16] = $PLabel16   $ProgressArray[17] = $PLabel17   $ProgressArray[18] = $PLabel18   GUISetState()   $tCounter1 = 0   $tPlacehold = 5   Global $ProgressItem1 = IniRead($InstallFile, "Config", "Progress1", "1")   Global $ProgressItem2 = IniRead($InstallFile, "Config", "Progress2", UBound($SelectedSections) - 1)   $tProgressItem = 1   For $i = 0 To UBound($SelectedArray) - 1    Select     Case $SelectedArray[$i][1] = "Section"      $Subcommands = FindNumberOfSubcommands($i + 1)      $CurrentSubCommand = 0      GUICtrlSetData($ProgressOverall, 100 * ($ProgressItem1 - 1) / $ProgressItem2)      Select       Case UBound($SelectedSections) - 1 <= 18        UpdateProgressBar($PLabel1, $ProgressArray[UBound($SelectedSections) - 1], $ProgressArray[$tProgressItem], $SelectedSections, 1, $Subcommands)       Case $tProgressItem < 5        UpdateProgressBar($PLabel1, $PLabel18, $ProgressArray[$tProgressItem], $SelectedSections, 1, $Subcommands)       Case (UBound($SelectedSections) - 1) - $tProgressItem > 13        UpdateProgressBar($PLabel1, $PLabel18, $ProgressArray[5], $SelectedSections, 1 + $tCounter1, $Subcommands)        $tCounter1 = $tCounter1 + 1       Case (UBound($SelectedSections) - 1) - $tProgressItem <= 13        UpdateProgressBar($PLabel1, $PLabel18, $ProgressArray[$tPlacehold], $SelectedSections, 1 + $tCounter1, $Subcommands)        $tPlacehold = $tPlacehold + 1      EndSelect      $tProgressItem = $tProgressItem + 1      $ProgressItem1 = $ProgressItem1 + 1     Case $SelectedArray[$i][1] = "Context"      GUICtrlSetData($LabelContext, $SelectedArray[$i][0])     Case $SelectedArray[$i][1] = "Description"      $Description = $SelectedArray[$i][0]      GUICtrlSetData($LabelDescription, $SelectedArray[$i][0])     Case Else      If $SelectedArray[$i][1] = "Run" Or $SelectedArray[$i][1] = "RunWait" Or $SelectedArray[$i][1] = "DOS" Or _        $SelectedArray[$i][1] = "MSI" Or $SelectedArray[$i][1] = "REG" Or $SelectedArray[$i][1] = "WaitProcess" Then       If $Subcommands > 2 Then        GUICtrlSetData($ProgressSubItems, 100 * ($CurrentSubCommand) / $Subcommands)        $CurrentSubCommand = $CurrentSubCommand + 1       EndIf      EndIf      RunCommand($SelectedArray[$i][0], $SelectedArray[$i][1], $i)    EndSelect   Next EndIf If $ProgressType = 1 Then   ProgressOn("Progress", "Software Installation", "   Overall progress", -1, -1, 16)   For $i = 0 To UBound($SelectedArray) - 1    If $SelectedArray[$i][1] = "Section" Then     ProgressSet($tItems * 100 / $SoftwareToInstall, "   Overall progress - " & Round($tItems * 100 / $SoftwareToInstall) & _       "%%", $SelectedArray[$i][0])     $tItems = $tItems + 1    Else     RunCommand($SelectedArray[$i][0], $SelectedArray[$i][1], $i)    EndIf   Next   ProgressSet(100, "   Overall progress - 100%%", "Finished")   Sleep(1000) EndIf WriteLog(3, 1, 1, 1) EndFunc   ;==>Install ;save current status on reboot missing Func RunCommand($tCommand, $tType, ByRef $tCounter) Select   Case $tType = "Run"    If $Log = 1 Then WriteLog(1, "Run", $Append & $tCommand, 0)    Run($Append & $tCommand, "", $Flag)    If $Log = 1 Then WriteLog(2, "Run", $Append & $tCommand, @error)   Case $tType = "RunWait"    If $Log = 1 Then WriteLog(1, "RunWait", $Append & $tCommand, 0)    RunWait($Append & $tCommand, "", $Flag)    If $Log = 1 Then WriteLog(2, "RunWait", $Append & $tCommand, @error)   Case $tType = "MSI"    If $Log = 1 Then WriteLog(1, "MSI", 'msiexec /i "' & $Append & $tCommand, 0)    RunWait('msiexec /i "' & $Append & $tCommand, "", $Flag)    If $Log = 1 Then WriteLog(2, "MSI", 'msiexec /i "' & $Append & $tCommand, @error)   Case $tType = "DOS"    If $Log = 1 Then WriteLog(1, "DOS", @ComSpec & " /c " & $tCommand, 0)    RunWait(@ComSpec & " /c " & $tCommand, "", $Flag)    If $Log = 1 Then WriteLog(2, "DOS", @ComSpec & " /c " & $tCommand, @error)   Case $tType = "REG"    If $Log = 1 Then WriteLog(1, "REG", 'regedit /s "' & $Append & $tCommand & '"', 0)    RunWait('regedit /s "' & $Append & $tCommand & '"', "", $Flag)    If $Log = 1 Then WriteLog(2, "REG", 'regedit /s "' & $Append & $tCommand & '"', @error)   Case $tType = "WaitProcess"    If $Log = 1 Then WriteLog(1, "WaitProcess", $tCommand, 0)    ProcessWaitClose($tCommand)    If $Log = 1 Then WriteLog(2, "WaitProcess", $tCommand, 0)   Case $tType = "WinWaitClose"    If $Log = 1 Then WriteLog(1, "WinWaitClose", $tCommand, 0)    WinWait($tCommand)    WinWaitClose($tCommand)    If $Log = 1 Then WriteLog(2, "WinWaitClose", $tCommand, 0)   Case $tType = "Reboot"    If Mod($Reboot, 2) <> 0 Then     If FindNextSection($SelectedArray, $tCounter) <> -1 Then ;section <> last?      SaveToFile(@TempDir & "\Install-temp.ini", $tCounter + 1)      RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce", "Install", "REG_SZ", '"' & _        @ScriptFullPath & '" ' & @TempDir & "\Install-temp.ini 1")      If $ProgressType = 2 Then       IniWrite(@TempDir & "\Install-temp.ini", "Config", "Progress1", $ProgressItem1)       IniWrite(@TempDir & "\Install-temp.ini", "Config", "Progress2", $ProgressItem2)      EndIf     EndIf     WriteLog(4, 1, 1, 1)     Reboot($RebootTimer)    EndIf   Case $tType = "Folder"    $tFolder = $SelectedArray[$tCounter][0]    $tSwitch = ""    For $i = 1 To 3     Select      Case $SelectedArray[$tCounter + 1][1] = "FolderCommand"       $tFCommand = $SelectedArray[$tCounter + 1][0]       $tCounter = $tCounter + 1      Case $SelectedArray[$tCounter + 1][1] = "FolderFiles"       $tFileType = $SelectedArray[$tCounter + 1][0]       $tCounter = $tCounter + 1      Case $SelectedArray[$tCounter + 1][1] = "FolderSwitch"       $tSwitch = $SelectedArray[$tCounter + 1][0]       $tCounter = $tCounter + 1      Case Else     EndSelect    Next    If $tFolder <> "" And $tFileType <> "" And $tFCommand <> "" Then     If $Log = 1 Then WriteLog(1, "Folder", $tFolder, 0)     ProcessFolder($tFolder, $tFileType, $tFCommand, $tSwitch)     If $Log = 1 Then WriteLog(2, "Folder", $tFolder, 0)    EndIf   Case $tType = "FileExist"    $tVersion = ""    $tFile = ""    $tAction = ""    $tCount = 0    If $SelectedArray[$tCounter + 1][1] = "FileExistVersion" Then     $tVersion = $SelectedArray[$tCounter + 1][0]     $tCount = $tCount + 1    EndIf    If $SelectedArray[$tCounter + 1][1] = "FileExistAction" Then     $tAction = $SelectedArray[$tCounter + 1][0]     $tCount = $tCount + 1    EndIf    If $SelectedArray[$tCounter + 2][1] = "FileExistVersion" Then     $tVersion = $SelectedArray[$tCounter + 2][0]     $tCount = $tCount + 1    EndIf    If $SelectedArray[$tCounter + 2][1] = "FileExistAction" Then     $tAction = $SelectedArray[$tCounter + 2][0]     $tCount = $tCount + 1    EndIf    If Fileexist(1, $SelectedArray[$tCounter][0], $tVersion) = 1 Then     $tCounter = $tCounter + $tCount     If $tAction = "Skip" Then $tCounter = $tCounter + 1     If $tAction = "SkipSection" Then $tCounter = FindNextSection($SelectedArray, $tCounter)    EndIf   Case $tType = "FileNotExist"    If Fileexist(0, $SelectedArray[$tCounter][0], "") = 1 Then     If $SelectedArray[$tCounter + 1][1] = "FileNotExistAction" Then      $tAction = $SelectedArray[$tCounter + 1][0]      $tCounter = $tCounter + 1     EndIf     If $tAction = "Skip" Then $tCounter = $tCounter + 1     If $tAction = "SkipSection" Then $tCounter = FindNextSection($SelectedArray, $tCounter)    EndIf   Case Else EndSelect EndFunc   ;==>RunCommand Func ProcessFolder($tFolder, $tFileType, $tCommand, $tSwitch) If $tCommand <> "RunWait" And $tCommand <> "MSI" And $tCommand <> "REG" Then Return $tFile = FileFindFirstFile($tFolder & "\*." & $tFileType) If $tFile = -1 Then   Return EndIf While 1   $tNextFile = FileFindNextFile($tFile)   If @error Then Return   Select    Case $tCommand = "RunWait"     If $Log = 1 Then WriteLog(1, "   RunWait", $tFolder & "\" & $tNextFile & " " & $tSwitch, 0)     If $Subcommands > 2 Then      GUICtrlSetData($LabelDescription, $Description & " " & $tNextFile)      GUICtrlSetData($ProgressSubItems, 100 * ($CurrentSubCommand) / $Subcommands)      $CurrentSubCommand = $CurrentSubCommand + 1     EndIf     RunWait($tFolder & "\" & $tNextFile & " " & $tSwitch, "", $Flag)     If $Log = 1 Then WriteLog(2, "   RunWait", $tFolder & "\" & $tNextFile & " " & $tSwitch, @error)    Case $tCommand = "MSI"     If $Log = 1 Then WriteLog(1, "   MSI", 'msiexec /i "' & $tFolder & "\" & $tNextFile & '" ' & $tSwitch, 0)     If $Subcommands > 2 Then      GUICtrlSetData($LabelDescription, $Description & " " & $tNextFile)      GUICtrlSetData($ProgressSubItems, 100 * ($CurrentSubCommand) / $Subcommands)      $CurrentSubCommand = $CurrentSubCommand + 1     EndIf     RunWait('msiexec /i "' & $tFolder & "\" & $tNextFile & '" ' & $tSwitch, "", $Flag)     If $Log = 1 Then WriteLog(2, "   MSI", 'msiexec /i "' & $tFolder & "\" & $tNextFile & '" ' & $tSwitch, @error)    Case $tCommand = "REG"     If $Log = 1 Then WriteLog(1, "   REG", 'regedit /s "' & $tFolder & "\" & $tNextFile & '" ' & $tSwitch, 0)     If $Subcommands > 2 Then      GUICtrlSetData($LabelDescription, $Description & " " & $tNextFile)      GUICtrlSetData($ProgressSubItems, 100 * ($CurrentSubCommand) / $Subcommands)      $CurrentSubCommand = $CurrentSubCommand + 1     EndIf     RunWait('regedit /s "' & $tFolder & "\" & $tNextFile & '" ' & $tSwitch, "", $Flag)     If $Log = 1 Then WriteLog(2, "   REG", 'regedit /s "' & $tFolder & "\" & $tNextFile & '" ' & $tSwitch, @error)    Case Else   EndSelect WEnd EndFunc   ;==>ProcessFolder Func RegCheck($tAction, $tRegPath, $tKey) EndFunc   ;==>RegCheck ;continue after restart (save all items, where to start, owerall progress) ;regcheck ;----------------------------------------------------- Func _inicheck() $versioncheck1 = FileExists(@ScriptDir & "\config\" & $Ver & ".ini") if $versioncheck1 = 0 then   MsgBox(0, "Error", "The INI file for this OS is not found. The supported OS are:"& @CRLF _                     &""& @CRLF _         &"  Windows 95"& @CRLF _         &"  Windows 98"& @CRLF _         &"  Windows ME"& @CRLF _         &"  Windows NT4"& @CRLF _         &"  Windows 2000"& @CRLF _         &"  Windows XP 32 Bit"& @CRLF _         &"  Windows XP 64 Bit"& @CRLF _         &"  Windows Server 2003"& @CRLF _         &"  Windows Vista"& @CRLF _         &"  Windows Server 2008"& @CRLF _         &"  Windows 7 32 Bit"& @CRLF _         &"  Windows 7 64 Bit"& @CRLF _         &""& @CRLF _         &"                               Click OK to exit.")   Exit EndIf EndFunc


Additional files that are needed BEFORE you run the script: Attached File  config.zip   11.83KB   823 downloads
Warning: if you run the script without these files you will get an error then the script will exit.

Supported Operating Systems:
Windows 95
Windows NT4
Windows 98
Windows ME
Windows 2000
Windows XP 32 Bit
Windows XP 64 Bit
Windows Server 2003
Windows Vista
Windows Server 2008
Windows 7 32 Bit
Windows 7 64 Bit

Instructions to examine code and to run from SciTE:
1. Copy the code in the Main Script code box below to SciTE. Save the code in it's own folder and call it install.au3.
2. In the same folder where the install.au3 script is located create a new folder and call it "config". You will be placing the config files in this folder.
3. Download config.zip and unzip in the config folder. THERE SHOULD BE NO SUB FOLDERS IN THE CONFIG FOLDER.
4. Run the script in SciTE.

Now, I coded it to support XP 32 and 64 bit, WIndows 7 32 and 64 bit as well as other operating systems. If you need other Operating systems added, it is easy to add. Do this:
On line 80 you will find the function ReturnOSVersion(). This function is what you edit to add support for other operating systems. (Only Windows based, not Linux!)

For example I want to add support for Windows Vista 64 bit. I will change:
Case $Ver = "WIN_VISTA" $OS = "Windows Vista"

to
Case $Ver = "WIN_VISTA"   If @OSArch = "X86" then    $Ver = "WIN_VISTA_32"       $OS = "Windows Vista - 32Bit  "   EndIf   If @OSArch = "X64" then     $Ver = "WIN_VISTA_64"       $OS = "Windows Vista - 64Bit  "   EndIf


Second: You also will need to create a ini file to go along with the new Windows version you want supported. In the above example I created support for 32 bit and 64 bit Windows Vista. You will find in the config folder an INI called "win_vista.ini". Simply create a copy of this file and call it win_vista_64.ini. Then rename "win_vista.ini" to "win_vista_32.ini". The important thing to remember here is the name of the INI file has to be the same as the $Ver you use.

Now, to edit the INI file for the OS in question. When you want to add a app to install you need to have the package already built for it. In other words: for example if you wanted to install Office 2010 you will need to have produced the autoit installation script, compiled it, and have it ready to run if needed.
To add the path to the install file you would do something like this:
[   Office 2010] Context = Installing Office 2010 runwait = \\Server\APPS\Microsoft Products\MS_Office_2010\Office 2010\install.exe []

To explain the above example:
[ Office 2010] - The first line is like a section header. It is what will be listed as the name of the application in your app list in the Right window.
"Context" is what will be displayed in the popup window while the app is installing.
"Runwait" is the command that launches the app.
[] puts a row space in the list

For the most part Runwait is usually what you will use for installing applications. The reason is you do not want multiple apps installing at once. This can cause issues.

In other cases you can use "msiexec" if the package you have is a MSI package and you want to use command line switches as shown in the below example:
[   Single Signon manager] context = Installing Single Signon manager runwait = msiexec /i "\\Server\APPS\Single_Signon_Manager\SSO_v6\NovellSecureLogin_6.0.msi" /passive /norestart runwait = msiexec /i "\\Server\APPS\Single_Signon_Manager\SSO_v6\NovellSecureLogin_6.0_Patch.msi" /passive /norestart []


The big thing to remember is this tool is in a nutshell a simple way to point to your install scripts, applications, or tools you want to run. As long as you run the tool from a place that the INI file's settings are correct the tool will work. We use ours from a server so we can access it from any PC in the building.

Change Log: Version 1 posted

Future plans (when I have time or if someone wants to contribute to the project):
1. Add a GUI tool to edit the INI files. (See 2nd port in this thread)
2. Add Software uninstall tool (See 3rd post in this thread)
3. Add Software license management support (see 4th post in this thread)
4. Add help file (See 5th post in this thread)
5. Add support for order the software gets installed
6. Add other ideas from other users.

Disclaimer: Use this script and tools at your own risk. This script is opensource and by using this code in its current form you agree to hold the original author and all other contributors harmless.

Release notes:
At this time the script does not support the latest beta release of Windows 8.

Edited by MPH, 12 October 2011 - 07:04 PM.








#2 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 04 October 2011 - 01:44 PM

GUI tool to edit the INI files. In Development

The following script is a GUI prototype of what I have in mind to edit the Operating System INI files.
Note: the ico file referenced on row 10 can be downloaded here: Attached File  Tools.ico   3.55KB   341 downloads

AutoIt         
#include <ButtonConstants.au3> #include <ComboConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <TabConstants.au3> #include <WindowsConstants.au3>   $Form1 =      GUICreate("Vollatran - Add/Remove Program", 737, 449, 192, 114)               GUISetIcon(@ScriptDir&"\config\Tools.ico", -1) $Input1 =    GUICtrlCreateInput("", 9, 47, 321, 21) $Label1 =    GUICtrlCreateLabel("Program name", 9, 30, 72, 17) $Label2 =    GUICtrlCreateLabel("Add/Remove program to list of available programs to install", 127, 6, 475, 24)               GUICtrlSetFont($Label2, 12, 800, 0, "MS Sans Serif") $Label3 =    GUICtrlCreateLabel("Path", 9, 72, 26, 17) $Input2 =    GUICtrlCreateInput("", 9, 90, 321, 21) $Select =    GUICtrlCreateButton("Select", 337, 90, 89, 21) $Label4 =    GUICtrlCreateLabel("Type of file action", 9, 116, 86, 17) $Combo1 =    GUICtrlCreateCombo("", 9, 135, 153, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))               GUICtrlSetData($Combo1, "Run|RunWait|MSI|DOS|REG|WaitProcess|WinWaitClose", "Run") ; add other item snd set a new default $Label5 =    GUICtrlCreateLabel("Command line switches", 9, 163, 114, 17) $Input3 =    GUICtrlCreateInput("", 9, 181, 321, 21) $Label6 =    GUICtrlCreateLabel("Select the OS you want this program to be available to:", 9, 272, 262, 17) $Checkbox1 =  GUICtrlCreateCheckbox("Windows 95", 9, 295, 97, 15) $Checkbox2 =  GUICtrlCreateCheckbox("Windows 98", 9, 318, 97, 15) $Checkbox3 =  GUICtrlCreateCheckbox("Windows ME", 9, 363, 104, 15) $Checkbox4 =  GUICtrlCreateCheckbox("Windows NT4", 9, 340, 104, 15) $Checkbox5 =  GUICtrlCreateCheckbox("Windows 2000", 136, 295, 97, 15) $Checkbox6 =  GUICtrlCreateCheckbox("Windows XP 32 Bit", 136, 318, 121, 15) $Checkbox7 =  GUICtrlCreateCheckbox("Windows XP 64 Bit", 136, 363, 128, 15) $Checkbox8 =  GUICtrlCreateCheckbox("Windows Server 2003", 136, 340, 130, 15) $Checkbox9 =  GUICtrlCreateCheckbox("Windows Vista", 291, 295, 97, 15) $Checkbox10 = GUICtrlCreateCheckbox("Windows Server 2008", 291, 318, 130, 15) $Checkbox11 = GUICtrlCreateCheckbox("Windows 7 32 Bit", 291, 363, 128, 15) $Checkbox12 = GUICtrlCreateCheckbox("Windows 7 64 Bit", 291, 340, 120, 15) $Combo2 =    GUICtrlCreateCombo("", 8, 228, 153, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL)) $Button1 =  GUICtrlCreateButton("New Group", 176, 228, 73, 21) $Button2 =  GUICtrlCreateButton("Add program", 152, 395, 121, 33) $Button3 =  GUICtrlCreateButton("Remove program", 472, 397, 105, 33) $Label7 =    GUICtrlCreateLabel("Add to group (optional)", 9, 206, 111, 17) $Button4 =  GUICtrlCreateButton("Remove Group name", 615, 398, 113, 33)   ;tabs $Win_OS =    GUICtrlCreateTab(472, 31, 257, 337) $Win_95 = GUICtrlCreateTabItem("Windows 95") $Edit1 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit1, "Edit1") $Win_98 =GUICtrlCreateTabItem("Windows 98") $Edit2 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit2, "Edit2") $Win_ME = GUICtrlCreateTabItem("Windows ME") $Edit3 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit3, "Edit3") $Win_NT4 =GUICtrlCreateTabItem("Windows NT4") $Edit4 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit4, "Edit4") $Win_2000 = GUICtrlCreateTabItem("Windows 2000") $Edit5 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit5, "Edit5") $Win_XP_32 =GUICtrlCreateTabItem("Windows XP 32 Bit") $Edit6 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit6, "Edit6") $Win_XP_64 = GUICtrlCreateTabItem("Windows XP 64 Bit") $Edit7 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit7, "Edit7") $Win_2003 =GUICtrlCreateTabItem("Windows Server 2003") $Edit8 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit8, "Edit8") $Win_Vista = GUICtrlCreateTabItem("Windows Vista") $Edit9 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit9, "Edit9") $Win_2008 =GUICtrlCreateTabItem("Windows Server 2008") $Edit10 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit10, "Edit10") $Win_7_32 = GUICtrlCreateTabItem("Windows 7 32 Bit") $Edit11 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit11, "Edit11") $Win_7_64 =GUICtrlCreateTabItem("Windows 7 64 Bit") $Edit12 = GUICtrlCreateEdit("", 480, 60, 241, 300) GUICtrlSetData($Edit12, "Edit12")   GUISetState(@SW_SHOW)   While 1     $nMsg = GUIGetMsg()     Switch $nMsg         Case $GUI_EVENT_CLOSE             Exit     EndSwitch WEnd

Edited by MPH, 05 October 2011 - 12:49 AM.


#3 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 04 October 2011 - 01:44 PM

Software uninstall tool For future use

#4 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 04 October 2011 - 01:44 PM

Software license management support For future use

#5 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 04 October 2011 - 01:44 PM

help file For future use

#6 insomnai

insomnai

    Seeker

  • Active Members
  • 47 posts

Posted 04 October 2011 - 01:51 PM

I'll be keeping an eye on this one with interest, thanks for sharing!!

#7 Chimaera

Chimaera

    Sorry .. Where am i again?

  • Active Members
  • PipPipPipPipPipPip
  • 2,013 posts

Posted 04 October 2011 - 02:00 PM

Thanks it looks interesting, i have a similar thing written in cmd although a lot more basic, it just deals with the software we repeatedly use on all fresh installs.

Ill keep watching

Edited by Chimaera, 05 October 2011 - 08:21 AM.

If Ive just helped you ... miracles do happen. Chimaera 

 

CopyRobo() * Hidden Admin Account Enabler * Software Location From Registry * Find Display Resolution * _ChangeServices()


#8 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 04 October 2011 - 02:30 PM

There is a problem in the forum. The first post got trashed. I'm trying to get the powers that be to fix it. For the moment I can't edit the first post. I did get the post to work here: http://www.autoitscript.com/forum/topic/132398-forum-upgrade/page__view__findpost__p__931119

#9 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 04 October 2011 - 02:33 PM

This is a better picture:

http://www.autoitscript.com/forum/index.php?app=core&module=attach&section=attach&attach_rel_module=msg&attach_id=33411

#10 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 05 October 2011 - 12:49 AM

First thread is fixed for everyone's pleasure.

#11 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 05 October 2011 - 01:00 AM

The following post was lifted from a PM I had posted a while back. Some of you may find it interesting and help in using Vollatran:
1. Use Vollatran on a backpack or thumb drive
2. Shortcuts or alternative methods to scripting installs

It is easy to point to the backpack. All you need to do it make a sub folder in the same folder you have your script. Put your scripts there. The files and folders in the root folder should look like this:

Config folder
Bin folder (where you keep your apps you install)
Vollatran.exe (the installer app. It is what I named it, you can name it what you like)

---------------
Once you have setup your file structure for your apps off the bin folder you can map to them in the ini files like this example:

[test] context = running path test from bin runwait = bin\test\msgtest.exe   []   [-OFFICE-]   [Microsoft Office 2010] context = Installing Office 2010 runwait = bin\Microsoft\office 2010\install2010.exe


What application are you trying to script to install? In many cases the installer that comes with the application supports command line switches or an answer file. When this is true then installation is easy. For example, the application ccleaner from Piriform supports command line switches.

http://www.piriform.com/ccleaner/faq/ins...n-ccleaner-be-installed-and-ru

It is simple then to run the install. Just point to the setup.exe in the ini and add the correct switch. No messing around with AutoIt trying to script each screen. You can look in the example I give to run a MSI package and you see how I use command line switches there if you need to see it first hand.

In other cases some folks will build a custom installer with InstallShield or Wise. What they do here is use a virtual PC that ha no apps loaded other than the version of Windows they want to install the app to. They take a "Snapshot" of the virtual machine to get all the settings, files and so forth. They then install the application and then take a second "Snapshot". Next they compare the two snapshots, seeing what is different. They take all the files and settings they find and build a installer package. It is a bit more labor intensive to setup but the beauty is one can setup the app to the exact specification they want. For example the app you want to install adds the yahoo toolbar to Internet Explorer. You can use this method to build a package but remove this feature.


Edited by MPH, 05 October 2011 - 01:01 AM.


#12 storme

storme

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 850 posts

Posted 05 October 2011 - 11:21 AM

I've been sidetracked since I last wrote to you. :)
But I've had a quick look over the script and it looks great!
When I get time I'll convert over some of my batch files and see how it goes in real world situation. :graduated:
Expect seom questions. ;)

Thanks for sharing.
John

#13 Chimaera

Chimaera

    Sorry .. Where am i again?

  • Active Members
  • PipPipPipPipPipPip
  • 2,013 posts

Posted 05 October 2011 - 01:32 PM

I tried to download the config.zip and i get this errror

[#10171] You do not have permission to view this attachment.

Is there a public download plz?

Edited by Chimaera, 05 October 2011 - 01:33 PM.

If Ive just helped you ... miracles do happen. Chimaera 

 

CopyRobo() * Hidden Admin Account Enabler * Software Location From Registry * Find Display Resolution * _ChangeServices()


#14 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 05 October 2011 - 06:36 PM

Hold on, I'll reupload it so you can download it.

#15 Bert

Bert

    Why yes....

  • MVPs
  • 12,048 posts

Posted 05 October 2011 - 06:39 PM

first post updated with new config file.

#16 zuardin

zuardin

    Seeker

  • New Members
  • 1 posts

Posted 09 December 2012 - 10:46 PM

hope to work for windows 8

#17 autoitaddicted

autoitaddicted

    Seeker

  • Active Members
  • 29 posts

Posted 11 February 2013 - 03:31 PM

very nice idea.

#18 Draygoes

Draygoes

    Because yes!

  • Active Members
  • PipPipPipPipPipPip
  • 3,331 posts

Posted 17 March 2013 - 10:08 PM

This is great yogi!
I have written a few similer tools, so if you ever need help tweaking this, feel free to ask. ;)

"If a vegetarian eats vegetables,What the heck does a humanitarian eat?"

"I hear voices in my head, but I ignore them and continue on killing."

"You have forced me to raise the indifference warning to beige, it's a beige alert people. As with all beige alerts please prepare to think about the possibility of caring."

An optimist says that giving someone power DOESN'T immediately turn them into a sadist.
A pessimist says that giving someone power doesn't IMMEDIATELY turn them into a sadist.

 

#19 ChuckNorrious

ChuckNorrious

    Seeker

  • Active Members
  • 12 posts

Posted 20 March 2013 - 05:55 AM

Wow, pretty cool.

#20 clo312

clo312

    Seeker

  • Active Members
  • 26 posts

Posted 31 August 2013 - 07:37 PM

Hi MVP can you please help me get this done I have been days searching for hoe to do this, nothing makes sense and still dont have my installer i am tring to create. If you could  help i would appreciate it,. I have posted what i am trying to do im my other post. basically i need a cd that when inserted will autorun and the 10 programs I have and the 10th program has to aske me or auto ditect what bit system I am running a 32bit or a 64bit. PLease please Help

Thanks in advance

clo312






0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users