Windows获取系统的开机时长

注:获取的是开机时长,而不是开机时间

在网上看了很多教程,基本上都是获取系统的开机时间,而不是开机时长。360虽然可以获取到开机时长,但是这个计算方法是不准确的,并且程序员获取不到这个数据。话不多说,直接上干货。

附:卡机时间图
在这里插入图片描述

方法一:采用windows自带的事件查看器

步骤:“事件查看器---->windows日志---->系统---->筛选---->6013”
注:6013是事件ID
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
上述记录的有。但这是系统的,我们又如何能够拿到这个数据尼?

  1. 新建一个记事本,写入以下代码
  2. 将后缀改为 .bat,运行
  3. 注:第一次运行出现的是系统运行的时间(也就是开机到现在电脑一共运行了多久),第二次以及往后显示的都是开机时长
@echo off
CLS
COLOR 0a
MODE con: COLS=30 LINES=8
wevtutil qe system /f:text /q:*[System[(EventID=6013)]] >%temp%\Eventlog.txt
for /f "tokens=*" %%i in (%temp%\Eventlog.txt) do set str=%%i
echo.
echo.
echo.
echo %str%
echo.
echo.
pause
exit

但说实话,这个数据很不准确。(目前我也没有查到这个数据时系统加载时间还是什么,知道的大佬告知一下)

方法二:采用第三方工具 BootRacer
4. 下载工具
5. 运行,就会显示开机时长 (这个数据时比较准确的)

在这里插入图片描述
并且它会记录历史开机时长,点击下面的 History即可看到。

但是我们如何获取到这个数据尼?

  1. 这个程序会在后台自动生成日志文件,记录开机的相关信息。 文件位置:C:\Users\Public\Documents\bootracer.log
  2. 文件中Writing FullBoot字段就是开机时长

但是有两种情况,生成的日志文件会不一样:

  1. 如果电脑是重启的,就会有 Writing FullBoot: 字段,直接解析即可
  2. 如果电脑是关机,再开机的,计算方法就不一样,需要找到 Opened Mutex BootRacerOpti 以及Use Logon Time 字段,两者相减即可
    在这里插入图片描述
    附代码:
string SubTime(string endTime, string startTime)
{
    int end_h = atoi(endTime.substr(0, endTime.find_first_of(':')).c_str());
    int end_m = atoi(endTime.substr(endTime.find_first_of(':') + 1, endTime.find_last_of(':') - endTime.find_first_of(':') - 1).c_str());
    int end_s = atoi(endTime.substr(endTime.find_last_of(':') + 1).c_str());

    int start_h = atoi(startTime.substr(0, startTime.find_first_of(':')).c_str());
    int start_m = atoi(startTime.substr(startTime.find_first_of(':') + 1, startTime.find_last_of(':') - startTime.find_first_of(':') - 1).c_str());
    int start_s = atoi(startTime.substr(startTime.find_last_of(':') + 1).c_str());

    int hour = end_h - start_h;
    int minute = end_m - start_m;
    int second = end_s - start_s;

    int bootTime = 0;

    if (hour == 0)
    {
        if (minute == 0)
        {
            bootTime = second;
        }
        else
        {
            bootTime = minute * 60 + second;
        }
    }
    else
    {
        if (minute == 0)
        {
            bootTime = hour * 60 * 60 + second;
        }
        else
        {
            bootTime = hour * 60 * 60 + minute * 60 + second;
        }
    }
    return to_string(bootTime);
}

void ParseFile()
{
    const char* filePath = ""C:\\Users\\Public\\Documents\\bootracer.log";
    ifstream fIn(filePath, ios::binary);
    if (!fIn.is_open())
    {
        //日志文件,打开文件失败
        cout<< "Bootracer日志文件打开失败  错误码为:" << GetLastError();
        return;
    }

    int str1_line = 0;
    int str2_line = 0;
    int line = 0;
    string endTime;
    string startTime;
    string buf;
    string str1 = "Writing FullBoot";
    string str2 = "Opened Mutex BootRacerOpti";
    string str3 = "Use Logon Time";
    while (!fIn.eof())
    {
        string buf;
        buf.resize(100);
        getline(fIn, buf);
        ++line;

        int pos = 0;
        int str_pos1 = 0;
        int str_pos2 = 0;
        int str_pos3 = 0;

        while (buf[pos] != '\r' && str1.size() != str_pos1 && buf[pos] != '\0')
        {
            if (buf[pos] != str1[str_pos1])
            {
                pos = 0;
                str_pos1 = 0;
                break;
            }
            ++pos;
            ++str_pos1;
        }

        while (buf[pos] != '\r' && str2.size() != str_pos2 && buf[pos] != '\0')
        {
            if (buf[pos] != str2[str_pos2])
            {
                pos = 0;
                str_pos2 = 0;
                break;
            }
            ++pos;
            ++str_pos2;
        }

        while (buf[pos] != '\r' && str3.size() != str_pos3 && buf[pos] != '\0')
        {
            if (buf[pos] != str3[str_pos3])
            {
                pos = 0;
                str_pos3 = 0;
                break;
            }
            ++pos;
            ++str_pos3;
        }

        if (str1.size() == str_pos1)
        {
            string tmp = buf.substr(str1.size() + 2);
            tmp = tmp.substr(0, tmp.size() - 1);
            _bootTime = tmp;
            str1_line = line;
        }
        if (str2.size() == str_pos2)
        {
            int tmp_pos = buf.find_last_of(' ');
            string tmp = buf.substr(tmp_pos + 1);
            tmp = tmp.substr(0, tmp.size() - 1);
            endTime = tmp;
            str2_line = line;
        }
        if (str3.size() == str_pos3)
        {
            int tmp_pos = buf.find_last_of(' ');
            string tmp = buf.substr(tmp_pos + 1);
            tmp = tmp.substr(0, tmp.size() - 1);
            startTime = tmp;
        }
    }

    if (endTime.size() != 0 && startTime.size() != 0 && (str1_line + 1) != str2_line)
    {
        _bootTime = SubTime(endTime, startTime);
    }

    fIn.close();
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值