Search the Community
Showing results for tags 'software installer'.
-
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: ;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.
- 26 replies
-
- multiple installer
- software installer
- (and 2 more)
-
Hello All, I'm hoping someone can help. I am having issue converting some of my DOS batch files to use this script, all of the software packages are installing okay but I cannot for example get it to import a registry file or copy files to the desktop. Any advice will be most greatfully received. Thanks in advance, Tom.
- 3 replies
-
- multiple installer
- software installer
- (and 2 more)