批处理获取系统安装时间/系统开机时间/电脑唤醒时间及开机使用时间(六)bug排除

原代码中如果有月份/日/小时/分钟/为大于8的数值时,会显示08,DOS会认为是8进制数,导致代码出错,代码跑不完。解决办法:通过判断第一位是否为0,将数值改为第一位不是0的数值。其他是否还有bug还不知道。
echo "正在查询,请稍候……"
cls
@echo off
::提取systeminfo保存为systeminfo.txt文件
systeminfo >d:\systeminfo.txt

::导出1000条系统日志存为d:\log.txt文件
wevtutil qe system /c:1000 /rd:true /f:text >d:\log.txt

::在d:\log.txt文件中提取含有Power-Troubleshooter的行保存在d:\aaa.txt文件内。
findstr /n "Power-Troubleshooter" d:\log.txt >d:\aaa.txt

::提取d:\aaa.txt文件第一行并更新到d:\aaa.txt(即最后一次休眠唤醒时间)
setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n .* "d:\aaa.txt"') do (
set /a m+=1& if !m!==1 (echo %%j>d:\bbb.txt)) 

::提取行数
for /f "tokens=1,2 delims=:" %%i in (d:\bbb.txt) do set  var=%%i

::显示内容"初始安装日期"和“系统启动时间”
type d:\systeminfo.txt | findstr /B "初始安装日期" && type d:\systeminfo.txt | findstr /B "系统启动"

::显示休眠唤醒时间
for /f "skip=%var% delims=" %%a in (d:\log.txt) do (
set date1=%%~a
goto :Result
)
:Result
for /f "tokens=1,2 delims= " %%i in ("%date1%") do (set time0=%%j goto :wake_time
)
:wake_time
set wtime_y=%time0:~0,4%
set  wtime_m=%time0:~5,2%
::11
set wtime_d=%time0:~8,2%
::12
set  wtime_h=%time0:~11,8%
set /a wtime1=%wtime_y%/%wtime_m%/%wtime_d%, %wtime_h%
echo 系统唤醒时间:    %wtime_y%/%wtime_m%/%wtime_d%, %wtime_h%

::下面两行本应该在11和12的位置,但为了上面一行显示美观,显示完后再更改,不然数值是08时后面计算会出错。
if %wtime_m:~0,1%==0 set wtime_m=%wtime_m:~1,1% 
if %wtime_d:~0,1%==0 set wtime_d=%wtime_d:~1,1%

::计算及显示电脑使用时间
::1获取启动电脑时间赋值给btime,以供计算使用。
type d:\systeminfo.txt | findstr /B "系统启动">d:\ddd.txt
for /f "tokens=1,* delims= " %%i in (d:\ddd.txt) do set  btime=%%j

for /f "tokens=1,2,3,4,5,6 delims=/:, " %%i in ("%btime%") do (set  btime_y=%%i & ^
set  btime_m=%%j & ^
set  btime_d=%%k & ^
set  btime_h=%%l &^
set  btime_mi=%%m)
::将上面的08这样的数值都改成8。
if %btime_m:~0,1%==0 set btime_m=%btime_m:~1,1%
if %btime_d:~0,1%==0 set btime_d=%btime_d:~1,1%
if %btime_h:~0,1%==0 set btime_h=%btime_h:~1,1%
if %btime_mi:~0,1%==0 set btime_mi=%btime_mi:~1,1%

set /a btime_all=%btime_y%*365*24*60+^
%btime_m%*30*24*60+^
%btime_d%*24*60+^
%btime_h%*60+%btime_mi%

::计算唤醒总时间。
for /f "tokens=1,2 delims=:" %%i in ("%wtime_h%") do (set /a wtime_hh=%%i*1 & ^
set /a wtime_hm=%%j*1)
set /a wtime_all=%wtime_y%*365*24*60+^
%wtime_m%*30*24*60+^
%wtime_d%*24*60+^
%wtime_hh%*60+%wtime_hm%

::当前时间总时间。
set ntime_y=%date:~0,4%
set ntime_m=%date:~5,2%
set  ntime_d=%date:~8,2%
set  ntime_h=%time:~0,2%
set  ntime_mi=%time:~3,2%
::下面同样是改08为8。
if %ntime_m:~0,1%==0 set ntime_m=%ntime_m:~1,1%
if %ntime_d:~0,1%==0 set ntime_d=%ntime_d:~1,1%
::当前时间中小时前是没有0的,不用改。
if %ntime_mi:~0,1%==0 set ntime_mi=%ntime_mi:~1,1%

set /a ntime_all=%ntime_y%*365*24*60+^
%ntime_m%*30*24*60+^
%ntime_d%*24*60+^
%ntime_h%*60+%ntime_mi%

::时间差计算
set /a b_wtime=%btime_all%-%wtime_all% 
set /a n_wtime=%ntime_all%-%wtime_all%
set /a n_btime=%ntime_all%-%btime_all%
echo btime_all=%btime_all%
echo wtime_all=%wtime_all%
echo ntime_all=%ntime_all%
echo b_wtime=%b_wtime%
echo n_wtime=%n_wtime%
echo n_btime=%n_btime%
echo ------------------------------
if %b_wtime% LEQ 0  (echo 电脑使用时间为:%n_wtime%分钟。& set fin_time=%n_wtime%) else (echo 电脑使用时间为:%n_btime%分钟。 & set fin_time=%n_btime%)
echo ------------------------------

if %n_btime% GTR 10000 (echo 你的电脑距离上次重启已经7天了,建议重启一次电脑!!!!)

set hh=^


setlocal enabledelayedexpansion
msg %username% "系统启动时间:%btime% !hh!系统唤醒时间:%wtime1%!hh!电脑使用时间为:%fin_time%分钟。"
del d:\aaa.txt
del d:\bbb.txt
del d:\log.txt
del d:\systeminfo.txt
del d:\ddd.txt
::下面一行注释掉后,dos窗口自动关掉,只显示windows窗口。
::pause
echo on

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章