You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win10 VBScript统计距上次重启天数返回负值问题求助

问题原因

出现负天数的核心问题出在自定义的WMI时间转换逻辑上:

  • 原脚本手动切割WMI返回的时间字符串,硬编码拼接为MM/DD/YYYY格式后调用CDate转日期类型,一旦设备系统区域设置为非美区日期格式(比如中文系统常用的YYYY/MM/DD、欧洲区常用的DD/MM/YYYY),CDate会错误解析月、日字段,极端情况下解析出的上次开机时间晚于当前时间,DateDiff计算出的时间差自然为负值。
  • 脚本开头全局开启ON ERROR RESUME NEXT,WMI查询失败、时间解析报错时不会抛出异常,变量会保留异常值直接参与后续计算,进一步放大了问题。
  • 原脚本用分钟数整除24的方式计算天数存在临界误差,开机时长不满24小时的场景下计算结果不准。
修复方案

不要手动切割字符串做时间转换,直接调用WMI原生提供的SWbemDateTime对象解析CIM格式时间,完全不受系统区域日期格式影响;同时收紧错误捕获范围,增加异常兜底逻辑,精简冗余代码。
修复后的完整可直接运行脚本:

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set objfso = CreateObject("Scripting.FileSystemObject")
Set wshell = CreateObject("WScript.Shell")

strComputer = "."
str_folder = "C:\Temp\LogFolder"
str_logfile = str_folder & "\Logfile.log"
numUptDays = -1

' 仅在WMI查询环节临时开启错误捕获
On Error Resume Next
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
If Err.Number = 0 Then
    Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
    For Each objOS in colOperatingSystems
        Set wmiDateTime = CreateObject("WbemScripting.SWbemDateTime")
        wmiDateTime.Value = objOS.LastBootUpTime
        ' 转换为本地时区的日期时间格式,无区域兼容问题
        dtmLastBootupTime = wmiDateTime.GetVarDate(True)
        If Err.Number = 0 Then
            ' 直接按自然日计算间隔,避免整除计算的临界误差
            numUptDays = DateDiff("d", dtmLastBootupTime, Now)
        End If
    Next
End If
On Error GoTo 0

' 统一初始化日志目录与文件,移除原脚本重复的判断逻辑
If Not objfso.FolderExists(str_folder) Then
    objfso.CreateFolder str_folder
End If
If Not objfso.FileExists(str_logfile) Then
    Set objFile = objfso.CreateTextFile(str_logfile)
    objFile.Close
End If

' 异常兜底:获取开机时间失败时默认判定需要重启,避免漏判
If numUptDays < 0 Then
    UpdateLog Now & " -- 开机时间获取异常,判定为需要重启"
    wscript.Quit(1)
End If

If numUptDays > 13 Then
    UpdateLog Now & " -- 距上次重启" & numUptDays & "天,需要重启"
    wscript.Quit(1)
Else
    UpdateLog Now & " -- 距上次重启" & numUptDays & "天,无需重启"
    wscript.Quit(0)
End If

' 日志写入函数
Function UpdateLog(strContent)
    Set objFile = objfso.OpenTextFile(str_logfile, ForAppending, False)
    objFile.WriteLine strContent
    objFile.Close
End Function
修复点说明
  • 彻底移除手动切割时间字符串的转换逻辑,用系统原生WMI时间对象做解析,兼容所有区域设置的Windows 10设备,从根源上解决日期解析错位导致的负天数问题。
  • 去掉全局错误静默,仅在WMI查询环节临时捕获错误,避免异常值被掩盖。
  • 合并原脚本中重复的日志目录、日志文件创建逻辑,减少冗余代码。
  • 新增异常兜底逻辑,当WMI服务异常、时间解析失败时,直接返回需要重启的退出码,不会出现异常的负天数日志,也不会漏过需要重启的设备。
  • 改用DateDiff直接计算日期间隔天,替代原有的分钟整除逻辑,消除临界值计算误差。

内容的提问来源于stack exchange,提问作者Shijin Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:09:20