如何确定服务器的正常运行时间?

本文提供两种脚本,用于查询Windows服务器的正常运行时间。第一种适用于Windows XP和Windows Server 2003,第二种则针对Windows 2000。
问:

您好,脚本专家! 如何确定服务器的正常运行时间?

-- 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 计算机使用这样一个脚本,而只是以防万一…。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值