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
相关产品推荐
相关产品推荐

