Page 1 of 3
Trying to build a Uptime.exe alternative via native windows
Posted: 04 Jul 2012 22:12
by MKANET
I am curious if there is existing dos batch file code that can calculate how many days, hours, minutes, and seconds a remote machine has been up.
I can get the date and time a remote machine booted up.
Very fast method:
Code: Select all
wmic /node:"%remotemachine%" OS Get LastBootUpTime
Slow:
Code: Select all
systeminfo /s %remotemachine% | find "Boot Time"
I can calculate the number of days using jdate. However, I'm still stuck with converting to hours, minutes, and seconds.
jdate
http://www.dostips.com/DtCodeCmdLib.php#jdate.
I was hoping there is a more advanced version of jdate floating around that handles calculating the hours, minutes and seconds in addition to the julian date. I vaguely remember seeing something like that; but can't find it now.
Or, better yet.. maybe there's already dos batch code out there that already does this using just dos batch without having to rely on uptime.exe
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 04 Jul 2012 23:36
by miskox
has this info. Though I think this command is not available in XP Home. Don't know about other versions.
Also, I have a batch file (which I can upload later) which calculates the uptime using this (if I remember correctly) command:
But it is possible to reset these counters so this info might not be 100% reliable.
Saso
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 00:36
by foxidrive
Code: Select all
@echo off
for /f "delims=" %%a in ('wmic OS Get LastBootUpTime ^| find "."') do set up=%%a
for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find "."') do set dt=%%a
set beg=%up:~0,4%-%up:~4,2%-%up:~6,2%T%up:~8,2%-%up:~10,2%-%up:~12,2%-%up:~15,3%
set end=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%T%dt:~8,2%-%dt:~10,2%-%dt:~12,2%-%dt:~15,3%
call :TimeDifference uptime %end% %beg%
echo %beg%
echo %end%
echo Uptime is: %uptime%
pause
goto :eof
:TimeDifference Return_Variable Start_Date_Time Stop_Date_Time
:: Version -0 2009-12-25 Frank P. Westlake
:: Calculate the difference in time between parameter 2 and parameter 3
:: and return the values in the variable named by parameter 1.
::
:: Parameters 2 and 3 are ISO8601 DATE/TIMEs of the format
::
:: YYYY-MM-DDThh-mm-ss
::
:: where '-' may be any of '/:-., '.
::
:: RETURN:
:: The variable named by %1 will be set with a string containing each of
:: the following values seperated by spaces:
::
:: DAYS HOURS MINUTES SECONDS MILLISECONDS
::
:: EXAMPLE: Call :TimeDifference diff "2009-12-01T 1:00:00.00" "2009-11-30T13:00:00.01"
:: Sets variable "DIFF=0 12 0 0 10"
SetLocal EnableExtensions EnableDelayedExpansion
For /F "tokens=1-14 delims=T/:-., " %%a in ("%~2 %~3") Do (
Set "h2=0%%d" & Set "h3=0%%k" & Set "n2=%%g00" & Set "n3=%%n00"
Set /A "y2=%%a, m2=1%%b-100, d2=1%%c-100, h2=1!h2:~-2!-100, i2=1%%e-100, s2=1%%f-100, n2=1!n2:~0,3!-1000"
Set /A "y3=%%h, m3=1%%i-100, d3=1%%j-100, h3=1!h3:~-2!-100, i3=1%%l-100, s3=1%%m-100, n3=1!n3:~0,3!-1000"
)
Set /A "t2=((h2*60+i2)*60+s2)*1000+n2, t3=((h3*60+i3)*60+s3)*1000+n3"
Set /A "a=(14-m2)/12, b=y2-a, j2=(153*(12*a+m2-3)+2)/5+d2+365*b+b/4-b/100+b/400"
Set /A "a=(14-m3)/12, b=y3-a, j3=(153*(12*a+m3-3)+2)/5+d3+365*b+b/4-b/100+b/400"
Set /A "d=j3-j2, t=t3-t2"
If %d% LEQ 0 (If %d% LSS 0 (Set /A "d=j2-j3, t=t2-t3") Else If %t% LSS 0 (Set /A "t=t2-t3"))
If %t% LSS 0 (Set /A "t+=(1000*60*60*24), d-=1")
Set /A "n=t %% 1000, t/=1000, s=t %% 60, t/=60, m=t %% 60, t/=60"
EndLocal & Set "%~1=%d% %t% %m% %s% %n%"
Goto :EOF
:: END SCRIPT ::::::::::::::::::::::::::::::::::::::::
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 06:01
by Squashman
miskox wrote:has this info. Though I think this command is not available in XP Home. Don't know about other versions.
I believe you are correct on that but here is the code.
H:\>systeminfo | find "System Up Time"
System Up Time: 3 Days, 0 Hours, 29 Minutes, 12 Seconds
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 06:18
by foxidrive
It has changed in Windows 7
Code: Select all
System Boot Time: Thursday 05/07/2012, 14:26:57
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 06:27
by Squashman
foxidrive wrote:It has changed in Windows 7
Code: Select all
System Boot Time: Thursday 05/07/2012, 14:26:57
I gotta wonder what the hell MS is thinking some days!
NT 4 they provided a uptime tool to download which for the most parts works on NT,2000 and XP.
Then they give you the ability to find the uptime in XP Pro only.
Now they change it in Windows Vista and 7.

Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 06:31
by foxidrive
Maybe they don't want you to know how often Windows crashes.

Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 06:36
by Squashman
foxidrive wrote:Maybe they don't want you to know how often Windows crashes.

When I was a Linux server administrator I used to use a server side include to display the servers uptime on the bottom of a webpage. It was rather easy to do and that code hasn't changed in forever!
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 11:06
by MKANET
Thanks foxdrive.
The below time difference code is what I was looking for. I'll make sure I hang on to it. Thanks!
Code: Select all
:TimeDifference Return_Variable Start_Date_Time Stop_Date_Time
:: Version -0 2009-12-25 Frank P. Westlake
:: Calculate the difference in time between parameter 2 and parameter 3
:: and return the values in the variable named by parameter 1.
::
:: Parameters 2 and 3 are ISO8601 DATE/TIMEs of the format
::
:: YYYY-MM-DDThh-mm-ss
::
:: where '-' may be any of '/:-., '.
::
:: RETURN:
:: The variable named by %1 will be set with a string containing each of
:: the following values seperated by spaces:
::
:: DAYS HOURS MINUTES SECONDS MILLISECONDS
::
:: EXAMPLE: Call :TimeDifference diff "2009-12-01T 1:00:00.00" "2009-11-30T13:00:00.01"
:: Sets variable "DIFF=0 12 0 0 10"
SetLocal EnableExtensions EnableDelayedExpansion
For /F "tokens=1-14 delims=T/:-., " %%a in ("%~2 %~3") Do (
Set "h2=0%%d" & Set "h3=0%%k" & Set "n2=%%g00" & Set "n3=%%n00"
Set /A "y2=%%a, m2=1%%b-100, d2=1%%c-100, h2=1!h2:~-2!-100, i2=1%%e-100, s2=1%%f-100, n2=1!n2:~0,3!-1000"
Set /A "y3=%%h, m3=1%%i-100, d3=1%%j-100, h3=1!h3:~-2!-100, i3=1%%l-100, s3=1%%m-100, n3=1!n3:~0,3!-1000"
)
Set /A "t2=((h2*60+i2)*60+s2)*1000+n2, t3=((h3*60+i3)*60+s3)*1000+n3"
Set /A "a=(14-m2)/12, b=y2-a, j2=(153*(12*a+m2-3)+2)/5+d2+365*b+b/4-b/100+b/400"
Set /A "a=(14-m3)/12, b=y3-a, j3=(153*(12*a+m3-3)+2)/5+d3+365*b+b/4-b/100+b/400"
Set /A "d=j3-j2, t=t3-t2"
If %d% LEQ 0 (If %d% LSS 0 (Set /A "d=j2-j3, t=t2-t3") Else If %t% LSS 0 (Set /A "t=t2-t3"))
If %t% LSS 0 (Set /A "t+=(1000*60*60*24), d-=1")
Set /A "n=t %% 1000, t/=1000, s=t %% 60, t/=60, m=t %% 60, t/=60"
EndLocal & Set "%~1=%d% %t% %m% %s% %n%"
Goto :EOF
:: END SCRIPT ::::::::::::::::::::::::::::::::::::::::
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 12:36
by miskox
Here it is, if anyone wants it:
Code: Select all
@echo off
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Uptime days hours mins [secs]
::
:: By: Ritchie Lawrence, 2003-09-24. Version 1.0
::
:: Func: Obtains the number of days, hours, minutes and seconds of uptime.
:: For NT4/2000/XP/2003.
::
:: Args: %1 var to receive number of days of uptime (by ref)
:: %2 var to receive number of hours of uptime (by ref)
:: %3 var to receive number of minutes of uptime (by ref)
:: %4 var to receive number of seconds of uptime (optional, by ref)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "c=net statistics work"
set t=2&if "%date%z" LSS "A" set t=1
for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('echo/^|date') do (
for /f "tokens=%t%-4 delims=.-/ " %%d in ('date/t') do (
set %%a=%%d&set %%b=%%e&set %%c=%%f))
for /f "tokens=5-8 delims=:. " %%a in ('echo/^|time') do (
set "hh=%%a" & set "nn=%%b" & set "ss=%%c")
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
set /a hh=100%hh%%%100,nn=100%nn%%%100,f=j*1440+hh*60+nn
for /f "tokens=3-8 delims=/:M " %%a in ('%c%^|findstr/b /c:"Stat"') do (
set mm=%%a&set dd=%%b&set yy=%%c&set hh=%%d&set nn=%%e%%f)
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
if {%nn:~2,1%} EQU {P} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
if {%nn:~2,1%} EQU {A} if "%hh%" EQU "12" set hh=00
if {%nn:~2,1%} GEQ {A} set nn=%nn:~0,2%
set /a hh=100%hh%%%100,nn=100%nn%%%100,s=j*1440+hh*60+nn,n=f-s
set /a d=n/1440,n%%=1440,h=n/60,n%%=60
endlocal & echo/Uptime is: %d% days, %h% hours, %n% minutes, %ss% seconds. & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Saso
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 13:12
by Aacini
You may also use my
StdTime and StdDate programs for Time-to-milliseconds/Date-to-JDN and opposite conversions.
BTW, what represent the other data shown by wmic?
Code: Select all
>wmic OS Get LastBootUpTime
LastBootUpTime
20120705113410.500000-300
YYYYMMDDHHMMSS.??????????
Antonio
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 13:40
by MKANET
Hi Antonio, actually the whole point was to keep from having to depend on external exe's in this case. However that link may come in handy in the future. Thanks.
I also wondered the same thing. Not sure what that is after the decimal point.
Aacini wrote:You may also use my
StdTime and StdDate programs for Time-to-milliseconds/Date-to-JDN and opposite conversions.
BTW, what represent the other data shown by wmic?
Code: Select all
>wmic OS Get LastBootUpTime
LastBootUpTime
20120705113410.500000-300
YYYYMMDDHHMMSS.??????????
Antonio
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 13:42
by aGerman
See
CIM_DATETIMEyyyymmddHHMMSS.mmmmmmsUUU
Code: Select all
yyyy Four-digit year (0000 through 9999).
mm Two-digit month (01 through 12).
dd Two-digit day of the month (01 through 31).
HH Two-digit hour of the day using the 24-hour clock (00 through 23).
MM Two-digit minute in the hour (00 through 59).
SS Two-digit number of seconds in the minute (00 through 59).
mmmmmm Six-digit number of microseconds in the second (000000 through 999999).
s Plus sign (+) or minus sign (-) to indicate a positive or negative
offset from Coordinated Universal Times (UTC).
UUU Three-digit offset indicating the number of minutes that the
originating time zone deviates from UTC.
Regards
aGerman
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 14:28
by MKANET
Does anyone know where the wmic OS Get LastBootUpTime command originally get's it's boot start time from?
I know that the Windows Uptime.exe app bases it's info from a timestamp on the system page file. I think that systeminfo | find "Boot Time" also comes from the pagefile timestamp. I know of cases where there is something wrong with the pagefile, Uptime.exe gets confused with the timestamps; and, reports something weird like an uptime of 1200 days at my work. This doesn't happen too often, but it does happen.
With the help from this thread, I can make a better Uptime program for my work that first relies on WMIC. If the number of days is 1200 or more , to revert a less accurate method (the one that miskox posted); based on net statistics workstations; which gets this info from when the workstation service last started up.
Re: Trying to build a Uptime.exe alternative via native wind
Posted: 05 Jul 2012 15:12
by aGerman
I'm virtually certain it queries informations from the event logs.
Run "eventvwr.msc" and have a look at the Windows System events.
The log files are usually saved in %SystemRoot%\System32\Config but they are locked.
Regards
aGerman