您好,脚本专家! 如何确定服务器的正常运行时间?
-- LF
您好,LF。 这个问题很简单。 毕竟,我们假设您谈论的是 Windows 服务器,而 Windows 服务器是永远不停机的,对吗? 因此,正常运行时间肯定是无限长的。 问题得到了解决。
那么,我们假设 Windows 服务器会停机(可能是因为某个非 Windows 用户偷偷潜入并将电源插头或其他什么东西拔掉了)。 如果您想知道运行 Windows XP 或 Windows Server 2003 的计算机的系统正常运行时间,可使用以下脚本:
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery _ ("Select * From Win32_PerfFormattedData_PerfOS_System") For Each objOS in colOperatingSystems intSystemUptime = Int(objOS.SystemUpTime / 60) Wscript.Echo intSystemUptime & " minutes" Next
正如您所看到的,我们连接至 WMI 服务,然后使用 ExecQuery 方法来检索 Win32_PerfFormattedData_PerfOS_System 类中的所有实例。 (顺便提一下,这解释了该脚本只能在 Windows XP 或 Windows Server 2003 上运行的原因: 只有 Windows 的这两个版本中含有 Win32_PerfFormattedData_PerfOS_System 类。)
Win32_PerfFormattedData_PerfOS_System 包含许多与操作系统相关的性能计数器,其中包括 SystemUpTime,其可指示您机器已经运行了多长时间(以秒计)。 我们使用下面这行代码来获取 SystemUpTime 的值,并将其除以 60(这样显示的正常运行时间的单位为分钟,而不是秒),然后再将其转换为整数,除去小数点后的所有数字:
intSystemUptime = Int(objOS.SystemUpTime / 60)
是的,那正是一小行代码所要做的,简直太多了,不是吗? 然后我们回显变量 intSystemUptime 的值就可以了。
好了,除非您运行的是 Windows 2000,否则问题就解决了。 正如前面所述,上述脚本不能在 Windows 2000 上运行,Windows 2000 甚至从没听说过 Win32_PerfFormattedData_PerfOS_System 类。 幸运的是,存在一种解决方法;虽然有些笨拙,但毕竟也是一种解决方法:
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery _ ("Select * from Win32_OperatingSystem") For Each objOS in colOperatingSystems dtmBootup = objOS.LastBootUpTime dtmLastBootupTime = WMIDateStringToDate(dtmBootup) dtmSystemUptime = DateDiff("n", dtmLastBootUpTime, Now) Wscript.Echo dtmSystemUptime & " minutes" Next Function WMIDateStringToDate(dtmBootup) WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _ Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _ & " " & Mid (dtmBootup, 9, 2) & ":" & _ Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup,13, 2)) End Function
在此脚本中,我们连接至 WMI 服务,然后查询 Win32_OperatingSystem 类;那是因为 Win32_OperatingSystem 中包含一个属性 – LastBootUpTime – 该属性可告诉您计算机上次启动的时间。 这一点非常有用: 如果我们从当前时间中减去 LastBootUpTime,我们就会知道 – 没错 – 计算机已经运行了多长时间。
唯一棘手的部分是,与所有 WMI 日期和时间一样,LastBootUpTime 是以 UTC(通用时间坐标)格式存储的。 那就意味着将返回下面这样的值:
20050726071152.500000-420
在进行尝试之前,请不要费神从当前日期和时间中减去该值;那样做是徒劳的。 我们需要将该值转换成看起来更像实际日期和时间的形式;这正是我们之所以调用一个由我们编写的函数的原因,该函数可将 UTC datetime 值转换成常规的老式日期/时间值:
dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
注意。 我们将不对该函数的工作方式进行介绍。 如果您对此感兴趣,请参阅 Microsoft Windows 2000 Scripting Guide(英文)中的此部分。 |
转换完成后,我们通过 DateDiff 函数从当前时间中减去上次启动时间:
dtmSystemUptime = DateDiff("n", dtmLastBootUpTime, Now)
正如您所看到的,我们将三个参数传递给 DateDiff:
• | “n”,表示以分钟为单位报告时间差。 |
• | dtmLastBootUpTime,用来存储转换后的 datetime 值的变量。 |
• | Now,当前日期和时间。 |
我们接下来要做的就是以分钟为单位回显系统正常运行时间。
正如前面所述,我们无法想象您为何需要对 Windows 计算机使用这样一个脚本,而只是以防万一…。