Blue_Drache Posted May 9, 2007 Share Posted May 9, 2007 (edited) I hope that this finds some use! It's commented rather well. Enjoy. Edit: Quick little observation: This is more of a proof of concept for myself, but it does work over a LAN rather well. I'm sure it wouldn't take much to convert to enable auto-update over a WAN by connecting to the web resource, downloading the file and then examining it. Oh..that's NOT in the plan, I'd have to make a toggle switch and modify the code. expandcollapse popup#include <Date.au3> _AutoUpdate($CmdLine, "C:\FOLDER\FILE.EXE", "X:\FOLDER\FILE.EXE") Func _AutoUpdate($sz_CommandParam, $sz_fileSelf, $sz_fileRemote) Local $sz_dateSelf = "", $sz_dateRemote = "" Local $funcTemp = "", $t = "", $sz_WinTitleOld = AutoItWinGetTitle() AutoItWinSetTitle("AutoUpdate") If Not FileExists($sz_fileRemote) Then MsgBox(0, "AutoUpdate", "Error#:187" & @LF & "Update file not found. Program will continue normally") SetError(0) SetExtended(1) AutoItWinSetTitle($sz_WinTitleOld) Return 0 EndIf ; check here for command line parameters If $sz_CommandParam[0] > 0 Then ; commandline passed! If $sz_CommandParam[1] = "-update" Then ; 5a) If -update has been called, this is the temp file running. ; Copy the remote to the user's normal local folder, run the updated local, self-delete and exit. FileCopy($sz_fileRemote, $sz_fileSelf, 1) Run($sz_fileSelf) _SelfDelete() Exit Else ; 5b) If any other command line parameter has been called. Die. Horribly. MsgBox(0, "AutoUpdate", "Bad Command Line Parameter(s)" & @LF & "I only accept -update at this time.") Exit EndIf Else ; no command line passed ; 1) Get file date on self. $t = FileGetTime($sz_fileSelf, 1) If Not @error Then $sz_dateSelf = $t[0] & "/" & $t[1] & "/" & $t[2] & " " & $t[3] & ":" & $t[4] & ":" & $t[5] Else AutoItWinSetTitle($sz_WinTitleOld) SetError(1) Return 1 EndIf ; 2) Get file date on file in remote location $t = FileGetTime($sz_fileRemote, 1) If Not @error Then $sz_dateRemote = $t[0] & "/" & $t[1] & "/" & $t[2] & " " & $t[3] & ":" & $t[4] & ":" & $t[5] Else AutoItWinSetTitle($sz_WinTitleOld) SetError(2) Return 1 EndIf ; 3) Determine if remote is newer $t = _DateDiff('s', $sz_dateSelf, $sz_dateRemote) If @error Then AutoItWinSetTitle($sz_WinTitleOld) SetError(3) Return 1 EndIf Switch $t Case - 3600 To 3600 ; 4a) If the remote is an hour or less different, don't bother. AutoItWinSetTitle($sz_WinTitleOld) Return 0 Case Else ; 4b) Otherwise, copy remote into temp folder with random name. ; Execute the temp with command line parameter and terminate. $funcTemp = Random(1001, 9999, 1) FileCopy($sz_fileRemote, @TempDir & "\AUD-" & $funcTemp & ".exe") Run(@ComSpec & " /c " & @TempDir & '"\AUD-' & $funcTemp & '.exe" -update', "", @SW_HIDE) Exit EndSwitch EndIf EndFunc ;==>_AutoUpdate Func _SelfDelete($iDelay = 0) ; This is from the help file. Local $sCmdFile FileDelete(@TempDir & "\scratch.bat") $sCmdFile = 'ping -n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _ & ':loop' & @CRLF _ & 'del "' & @ScriptFullPath & '" > nul' & @CRLF _ & 'if exist "' & @ScriptFullPath & '" goto loop' & @CRLF _ & 'del ' & @TempDir & '\scratch.bat' FileWrite(@TempDir & "\scratch.bat", $sCmdFile) Run(@TempDir & "\scratch.bat", @TempDir, @SW_HIDE) EndFunc ;==>_SelfDelete Edited May 10, 2007 by Blue_Drache Lofting the cyberwinds on teknoleather wings, I am...The Blue Drache Link to comment Share on other sites More sharing options...
BillLuvsU Posted May 9, 2007 Share Posted May 9, 2007 Cool, only suggestion is in the SelfDelete function just rename any possibly already existing "scratch.bat"s to an unused name then rename it back. You know just incase some super inportants prog just happens to use a scratch.bat prog that just happens to be in the temp directory o_0. Then again thats just my over-cautios self talking. Good job again! [center][/center]Working on the next big thing.Currently Playing: Halo 4, League of LegendsXBL GT: iRememberYhslaw Link to comment Share on other sites More sharing options...
Blue_Drache Posted May 10, 2007 Author Share Posted May 10, 2007 Cool, only suggestion is in the SelfDelete function just rename any possibly already existing "scratch.bat"s to an unused name then rename it back. You know just incase some super inportants prog just happens to use a scratch.bat prog that just happens to be in the temp directory o_0. Then again thats just my over-cautios self talking. Good job again! The self delete function is ripped directly from the help file ... and honestly, nowadays, what program uses batch files? In the temp folder? I'm sure if you wanted you could put a random filename. Like this: Func _SelfDelete($iDelay = 0) ; This is from the help file. Local $sCmdFile, $sFileName $sFileName = "\" & Random(10000001, 99999999, 1) & ".bat" FileDelete(@TempDir & $sFileName) $sCmdFile = 'ping -n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _ & ':loop' & @CRLF _ & 'del "' & @ScriptFullPath & '" > nul' & @CRLF _ & 'if exist "' & @ScriptFullPath & '" goto loop' & @CRLF _ & 'del ' & @TempDir & $sFileName FileWrite(@TempDir & $sFileName, $sCmdFile) Run(@TempDir & $sFileName, @TempDir, @SW_HIDE) EndFunc ;==>_SelfDelete But ... meh. Overkill. Lofting the cyberwinds on teknoleather wings, I am...The Blue Drache Link to comment Share on other sites More sharing options...
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