Bert Posted October 4, 2011 Posted October 4, 2011 (edited) As of May 12th, 2020 - I no longer do much coding at all. If you have any questions about this software please post your questions in the main support forum. 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: Version of AutoIt required: 3.3.6.1. (or later) Main Script: expandcollapse popup;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: config.zip 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 May 4, 2021 by Bert maszd 1 The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Bert Posted October 4, 2011 Author Posted October 4, 2011 (edited) 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: Tools.ico expandcollapse popup#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 October 5, 2011 by MPH The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Bert Posted October 4, 2011 Author Posted October 4, 2011 Software uninstall tool For future use The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Bert Posted October 4, 2011 Author Posted October 4, 2011 Software license management support For future use The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Bert Posted October 4, 2011 Author Posted October 4, 2011 help file For future use The Vollatran project  My blog: http://www.vollysinterestingshit.com/
insomnai Posted October 4, 2011 Posted October 4, 2011 I'll be keeping an eye on this one with interest, thanks for sharing!!
Chimaera Posted October 4, 2011 Posted October 4, 2011 (edited) 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 October 5, 2011 by Chimaera If Ive just helped you ... miracles do happen. Chimaera CopyRobo() * Hidden Admin Account Enabler * Software Location From Registry * Find Display Resolution * _ChangeServices()
Bert Posted October 4, 2011 Author Posted October 4, 2011 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: The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Bert Posted October 4, 2011 Author Posted October 4, 2011 This is a better picture: http://www.autoitscript.com/forum/index.php?app=core&module=attach§ion=attach&attach_rel_module=msg&attach_id=33411 The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Bert Posted October 5, 2011 Author Posted October 5, 2011 First thread is fixed for everyone's pleasure. The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Bert Posted October 5, 2011 Author Posted October 5, 2011 (edited) 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 October 5, 2011 by MPH The Vollatran project  My blog: http://www.vollysinterestingshit.com/
storme Posted October 5, 2011 Posted October 5, 2011 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. Expect seom questions. Thanks for sharing. John Some of my small contributions to AutoIt Browse for Folder Dialog - Automation SysTreeView32 | FileHippo Download and/or retrieve program information | Get installedpath from uninstall key in registry | RoboCopy function John Morrison aka Storm-E
Chimaera Posted October 5, 2011 Posted October 5, 2011 (edited) 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 October 5, 2011 by Chimaera If Ive just helped you ... miracles do happen. Chimaera CopyRobo() * Hidden Admin Account Enabler * Software Location From Registry * Find Display Resolution * _ChangeServices()
Bert Posted October 5, 2011 Author Posted October 5, 2011 Hold on, I'll reupload it so you can download it. The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Bert Posted October 5, 2011 Author Posted October 5, 2011 first post updated with new config file. The Vollatran project  My blog: http://www.vollysinterestingshit.com/
Draygoes Posted March 17, 2013 Posted March 17, 2013 This is great yogi! I have written a few similer tools, so if you ever need help tweaking this, feel free to ask. Spoiler  "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.  Â
clo312 Posted August 31, 2013 Posted August 31, 2013 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
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now