Shane0000 Posted August 14, 2012 Share Posted August 14, 2012 (edited) Im trying to write a small backup program using rar.exe. I am using $STDOUT_CHILD to make a log of added/updated files. Ive looked around and googled the subject, but I cant find out why im getting trunicated data from $STDOUT_CHILD. Does anyone have any ideas as to why this is happening or another method to get the full text from rar.exe. Thanks. Im getting output like: expandcollapse popupUpdate Time: 0h0m4s Exit Code: 0 Log: Creating archive c:backuptest.rar Adding c:bun5120717_0001.jpg Adding c:bun5120717_0002.jpg Adding c:bun5banner.psd Adding c:bun5eula.3082 - Copy.txt Adding c:bun5eula.3082.txt Adding c:bun5PHP and MySQL by Example.pdf Adding c:bun5utorrent.exe Adding data recovery record STD STDO STDOUT: Done Update Time: 0h0m1s Exit Code: 0 Log: Updating archive c:backuptest.rar Updating c:bun5eula.1028.txt Adding data recovery rec STDO STDO STDO STD STD STDO STDO STD STDO STD STDO STDOUT: Done Other times, filenames will be missing and there will be no closing comments (ie adding data recovery ...) expandcollapse popup#include <Process.au3> #include <Timers.au3> #include <Constants.au3> Global $Pid $hour = 3600000 $Err = '' $Out = '' $EXE = 'C:Progra~1WinRARrar.exe' $SRC = 'c:bun5*.*' $DST = 'c:backuptest.rar' $OPT = ' u -r -rr5p -v4500000 -x*.bak -x*.dwl -xplot.log -xthumbs.db -x*0_Temp_Saves_0 ' & $DST & ' ' & $SRC $WRTime = 0 While 1 ;If @HOUR > 1 and @HOUR < 8 and _Timer_GetIdleTime() > 1.0*$hour and NOT ProcessExists("Rar.exe") then If not ProcessExists("Rar.exe") then $Pid = Run($EXE & ' ' & $OPT, "",@SW_HIDE,$STDERR_CHILD + $STDOUT_CHILD) $hHandle = _ProcessGetHandle($Pid) $WRStart = _Timer_Init(); While ProcessExists("Rar.exe") $_StderrRead = StderrRead ( $Pid ) If Not @error And $_StderrRead <> '' Then $Err &= ( "STDERR: " & $_StderrRead & @Crlf ) $_StdoutRead = StdoutRead ( $Pid ) If Not @error And $_StdoutRead <> '' Then $Out &= ( "STDOUT: " & $_StdoutRead & @Crlf ) WEnd Local $WRTime = _Timer_Diff($WRStart) $iExitCode = _ProcessGetExitCode($Pid) _ProcessCloseHandle($hHandle) If $Out <> '' Then $TMP = StringReplace($Out,'',"") While StringInStr($TMP,"%") $PerLoc = StringInStr($TMP,"%") $TMP = StringReplace($TMP,StringMid($TMP,$PerLoc-4,5),"") ;removes xxx% WEnd $TMP = StringReplace($TMP, ' OK ','') $TMP = StringReplace($TMP, 'STDOUT:' & @CRLF,'') $TMP = StringReplace($TMP, 'STDOUT: ' & @CRLF,'') $TMP = StringReplace($TMP, 'STDOUT: ' & @CRLF,'') EndIf $LOG = FileOpen('c:backup' & @MDAY & '-' & @Mon & '-' & @Year & '.log',1) FileWrite($LOG, 'Update Time: ' & Time_Convert($WRTime) & @CRLF & 'Exit Code:' & @CRLF & $iExitCode & @CRLF & 'Log:' & @CRLF & $TMP & @CRLF & @CRLF ) FileClose($LOG) Sleep(12 * $hour) EndIf Sleep(0.5 * $hour) WEnd ; #FUNCTION# ==================================================================================================================== ; Name...........: _ProcessGetHandle() ; Description ...: Returns a handle from use of Run(). ; Syntax.........: _ProcessGetHandle($iPID) ; Parameters ....: $iPID - ProcessID returned from a Run() execution ; Return values .: On Success - Returns Process handle while Run() is executing (use above directly after Run() line with only PID parameter) ; On Failure - 0 ; Author ........: MHz (Thanks to DaveF for posting these DllCalls in Support Forum) ; Modified.......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: ; =============================================================================================================================== Func _ProcessGetHandle($iPID) ;Return handle of given PID Local Const $PROCESS_QUERY_INFORMATION = 0x0400 Local $avRET = DllCall("kernel32.dll", "ptr", "OpenProcess", "int", $PROCESS_QUERY_INFORMATION, "int", 0, "int", $iPID) If @error Then Return SetError(1, 0, 0) Else Return $avRET[0] EndIf EndFunc ;==>_ProcessGetHandle ; #FUNCTION# ==================================================================================================================== ; Name...........: _ProcessCloseHandle() ; Description ...: Closes a handle from use of Run(). ; Syntax.........: _ProcessCloseHandle($hProc) ; Parameters ....: $hProc - Process handle ; Return values .: On Success - Closes Process handle after a Run() has executed.; ; On Failure - 0 ; Author ........: MHz (Thanks to DaveF for posting these DllCalls in Support Forum), PsaltyDS ; Modified.......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: ; =============================================================================================================================== Func _ProcessCloseHandle($hProc) ;Close process handle Local $avRET = DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hProc) If @error Then Return SetError(1, 0, 0) Else Return 1 EndIf EndFunc ;==>_ProcessCloseHandle ; #FUNCTION# ==================================================================================================================== ; Name...........: _ProcessGetExitCode() ; Description ...: Returns a handle/exitcode from use of Run(). ; Syntax.........: _ProcessGetExitCode($hProc) ; Parameters ....: $hProc - Process handle ; Return values .: On Success - Returns Process Exitcode when Process does not exist. ; On Failure - 0 ; Author ........: MHz (Thanks to DaveF for posting these DllCalls in Support Forum), PsaltyDS ; Modified.......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: ; =============================================================================================================================== Func _ProcessGetExitCode($hProc) ;Get process exit code from handle Local $t_ExitCode = DllStructCreate("int") Local $avRET = DllCall("kernel32.dll", "int", "GetExitCodeProcess", "ptr", $hProc, "ptr", DllStructGetPtr($t_ExitCode)) If @error Then Return SetError(1, 0, 0) Else Return DllStructGetData($t_ExitCode, 1) EndIf EndFunc ;==>_ProcessGetExitCode Func Time_Convert($TimeDiff) $hrs = 0 $min = 0 $sec= Round($TimeDiff/1000,0) if $sec>59 then $hrs = int($sec / 3600) $sec = $sec - $hrs * 3600 $min = int($sec / 60) $sec = $sec - $min * 60 EndIf return $hrs & "h" & $min & "m" & $sec & "s" EndFunc Edited August 14, 2012 by Shane0000 Link to comment Share on other sites More sharing options...
Shane0000 Posted August 15, 2012 Author Share Posted August 15, 2012 Also Auto-it is using 50% cpu while rar.exe is running. Is there a way to get the screen dump right before the program ends. Link to comment Share on other sites More sharing options...
Shane0000 Posted August 15, 2012 Author Share Posted August 15, 2012 (edited) Nevermind, found a way. Abandoned this method cause it taxed the cpu, output was sketchy, and I dont need realtime updates. Edited August 15, 2012 by Shane0000 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