MadBoy Posted September 12, 2007 Posted September 12, 2007 I'm writting a program and need little time comparision. What i would like to achieve is to be able to compare to know how much time it passed since boot. So i created some functions that give current time and time of a boot. While i could simply compare $boot_min with $current_min when other $boot.. and $current.. variables match i came to point where i think it's a bit bare solution (and wouldn't realy work if its 23:59 since then the day will change and $boot_day and $current_day will be diffrent. I'm preety sure i seen this somewhere on forum but couldn't find it this time. More I think about the problem the more i go away from solution My brain is empty today. expandcollapse popup#include <Date.au3> #include <array.au3> $strComputer = "localhost" Global $time_of_boot, $current_time _GatherTimeBoot() Func _GatherTimeBoot() Local $time_current, $time_of_boot $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) then For $objItem In $colItems $time_of_boot = StringLeft($objItem.LastBootUpTime, 14) $time_current = StringLeft($objItem.LocalDateTime, 14) Next Else Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_OperatingSystem" ) Exit Endif $boot_year = StringLeft($time_of_boot, 4) $boot_month = StringMid($time_of_boot, 5,2) $boot_day = StringMid($time_of_boot, 7,2) $boot_hour = StringMid($time_of_boot, 9,2) $boot_min = StringMid($time_of_boot, 11,2) $boot_sec = StringMid($time_of_boot, 13,2) $current_year = StringLeft($time_current, 4) $current_month = StringMid($time_current, 5,2) $current_day = StringMid($time_current, 7,2) $current_hour = StringMid($time_current, 9,2) $current_min = StringMid($time_current, 11,2) $current_sec = StringMid($time_current, 13,2) $boot_time = _ArrayCreate("6", $boot_year, $boot_month, $boot_day, $boot_hour, $boot_min, $boot_sec) $current_time = _ArrayCreate("6", $current_year, $current_month , $current_day, $current_hour, $current_min, $current_sec) EndFunc Func WMIDateStringToDate($dtmDate) Return (StringMid($dtmDate, 5, 2) & "/" & _ StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _ & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2)) EndFunc ;==>WMIDateStringToDate Thanks, MadBoy My little company: Evotec (PL version: Evotec)
Developers Jos Posted September 12, 2007 Developers Posted September 12, 2007 does this one help ? Func PC_UPTIME() Local $day = "" Local $type = "" Local $hour = 0 Local $min = 0 Local $sec = 0 Local $uptime ; $ret = DllCall("kernel32.dll", "long", "GetTickCount") If IsArray($ret) Then $msec = StringRight("00" & Mod($ret[0], 1000), 3) $uptime = Int($ret[0] / 1000) $sec = StringRight("00" & Mod($uptime, 60), 2) If $uptime >= 60 Then $uptime = Int($uptime / 60) $min = StringRight("00" & Mod($uptime, 60), 2) If $uptime >= 60 Then $uptime = Int($uptime / 60) $hour = StringRight("00" & Mod($uptime, 24), 2) If $uptime >= 24 Then; convert hours to days $day = Int($uptime / 24) $type = "" If $day > 1 Then $type = "s" $type = " Day" & $type & " " EndIf EndIf EndIf Return ($day & $type & $hour & ":" & $min & ":" & $sec) EndIf EndFunc ;==>PC_UPTIME SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
MadBoy Posted September 12, 2007 Author Posted September 12, 2007 does this one help ? Func PC_UPTIME() Local $day = "" Local $type = "" Local $hour = 0 Local $min = 0 Local $sec = 0 Local $uptime ; $ret = DllCall("kernel32.dll", "long", "GetTickCount") If IsArray($ret) Then $msec = StringRight("00" & Mod($ret[0], 1000), 3) $uptime = Int($ret[0] / 1000) $sec = StringRight("00" & Mod($uptime, 60), 2) If $uptime >= 60 Then $uptime = Int($uptime / 60) $min = StringRight("00" & Mod($uptime, 60), 2) If $uptime >= 60 Then $uptime = Int($uptime / 60) $hour = StringRight("00" & Mod($uptime, 24), 2) If $uptime >= 24 Then; convert hours to days $day = Int($uptime / 24) $type = "" If $day > 1 Then $type = "s" $type = " Day" & $type & " " EndIf EndIf EndIf Return ($day & $type & $hour & ":" & $min & ":" & $sec) EndIf EndFunc ;==>PC_UPTIME Thank You. Exactly what i was looking for. Just couldn't find it My little company: Evotec (PL version: Evotec)
weaponx Posted September 12, 2007 Posted September 12, 2007 You could also use Windows uptime.exe:http://support.microsoft.com/kb/q232243/
MadBoy Posted September 12, 2007 Author Posted September 12, 2007 You could also use Windows uptime.exe:http://support.microsoft.com/kb/q232243/Thanks but autoit solutions are prefered for anything I do in AutoIt My little company: Evotec (PL version: Evotec)
Uten Posted September 12, 2007 Posted September 12, 2007 Not sure if this applies anymore but don't GetTickCount have a turnover point (It says 49.7 days in the link)? This thread seems to address the issue, even if a "complete" solution is not found due to sleep modes and such. Please keep your sig. small! Use the help file. Search the forum. Then ask unresolved questions :) Script plugin demo, Simple Trace udf, TrayMenuEx udf, IOChatter demo, freebasic multithreaded dll sample, PostMessage, Aspell, Code profiling
weaponx Posted September 12, 2007 Posted September 12, 2007 There is an issue with LastBootTime not being set correctly sometimes. This page shows an alternative using Win32_PerfRawData_PerfOS_System :http://groups.google.co.uk/group/microsoft...5010130e03e7617Check this out:; Generated by AutoIt Scriptomatic $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $strComputer = "localhost" $Output="" $Output = $Output & "Computer: " & $strComputer & @CRLF $Output = $Output & "==========================================" & @CRLF $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfOS_System", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) then For $objItem In $colItems $Output &= "SystemUpTime: " & $objItem.SystemUpTime & " seconds" & @CRLF $Output &= "SystemUpTime: " & $objItem.SystemUpTime / 60 & " minutes" & @CRLF $Output &= "SystemUpTime: " & ($objItem.SystemUpTime / 60) /60 & " hours" & @CRLF if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop $Output="" Next Else Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_PerfFormattedData_PerfOS_System" ) Endif
MadBoy Posted September 12, 2007 Author Posted September 12, 2007 Not sure if this applies anymore but don't GetTickCount have a turnover point (It says 49.7 days in the link)? This thread seems to address the issue, even if a "complete" solution is not found due to sleep modes and such.Uten fortunetly for my little project that won't be an issue Thanks for information! My little company: Evotec (PL version: Evotec)
Squirrely1 Posted January 9, 2008 Posted January 9, 2008 (edited) I found the following modification of Jos's code to be useful in writing a startup program. Using this function, my script will wait until more important startup programs have had time to load, before it does any intensive processing. MsgBox(64, "_PC_UptimeInMinutes()", _PC_UptimeInMinutes()) If _PC_UptimeInMinutes() < 5 Then Sleep(140000) EndIf Func _PC_UptimeInMinutes() Local $retVal $retVal = DllCall("kernel32.dll", "long", "GetTickCount") Return Round($retVal[0]/1000/60) EndFunc ;==>_PC_UptimeInMinutes Snippet Scrounger's rating - Edited January 9, 2008 by Squirrely1 Das Häschen benutzt Radar
Yanze Posted February 4, 2011 Posted February 4, 2011 There is an issue with LastBootTime not being set correctly sometimes. This page shows an alternative using Win32_PerfRawData_PerfOS_System : http://groups.google.co.uk/group/microsoft...5010130e03e7617 Check this out: ; Generated by AutoIt Scriptomatic $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $strComputer = "localhost" $Output="" $Output = $Output & "Computer: " & $strComputer & @CRLF $Output = $Output & "==========================================" & @CRLF $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfOS_System", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) then For $objItem In $colItems $Output &= "SystemUpTime: " & $objItem.SystemUpTime & " seconds" & @CRLF $Output &= "SystemUpTime: " & $objItem.SystemUpTime / 60 & " minutes" & @CRLF $Output &= "SystemUpTime: " & ($objItem.SystemUpTime / 60) /60 & " hours" & @CRLF if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop $Output="" Next Else Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_PerfFormattedData_PerfOS_System" ) Endif This code works for most of my workstations, but some do return a negative number ... any idea why?
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