2009年10月19日月曜日

VBScript,wsh で Uptime

Windows に uptime コマンドが無い。※一応MSが配布してるのもあるんだけどね。
 

だのでWSH(VBScript) で秒数だけ取ってみた。
スクリプト内でuptimeを判断するために作成したのでこれで十分。
 
 


Hey, Scripting Guy! サーバーの稼働時間を計算する
を参考に、"Win32_OperatingSystem" のプロパティ、LastBootUpTimeLocalDateTime を取得して差を見ればサーバの uptime になるだろうと。
あちらはもうPowerShellなので、普通はそっちの方がいいかもねぇ。
 
 

で、とりあえず書いた。標準出力と戻り値に秒を出す仕様だ。
手動キャストが泣ける・・・
 

[sourcecode language='vb']
'// ローカルコンピュータを指定
strComputer = "."

'// CIMV2名前空間のWin32_OperatingSystemクラスを取り込む
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( "SELECT * FROM Win32_OperatingSystem",,48)

'// オブジェクト回しの定型
For Each objItem in colItems

'// 最新の起動時間と、現在時刻をセット
tmpLBT=objItem.LastBootUpTime
tmpLDT=objItem.LocalDateTime

'// yyyymmddhhMMss を VBScriptの時刻形式に組み立てる、細かいところは切捨て
strLastBootUpTime = Left(tmpLBT,4) & "/" & _
Mid(tmpLBT,5,2) & "/" & _
Mid(tmpLBT,7,2) & " " & _
Mid(tmpLBT,9,2) & ":" & _
Mid(tmpLBT,11,2) & ":" & _
Mid(tmpLBT,13,2)

'// 上と同様
strLocalDateTime = Left(tmpLDT,4) & "/" & _
Mid(tmpLDT,5,2) & "/" & _
Mid(tmpLDT,7,2) & " " & _
Mid(tmpLDT,9,2) & ":" & _
Mid(tmpLDT,11,2) & ":" & _
Mid(tmpLDT,13,2)

'// 差を秒単位で取得
sec_uptime = DateDiff("s", strLastBootUpTime, strLocalDateTime)
Wscript.Echo sec_uptime
Next

'// 秒をExitコードに突っ込んで終了
Wscript.Quit(sec_uptime)
[/sourcecode]
 

"uptime.vbs"として保存、実行してみよう。

> cscript uptime.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
 
422718
 
>echo %errorlevel%
422718

 

多分OKやね。
日時分秒で表示するには適当なサブルーチンを作るしかないのかなあ。
 
 

ちなみに LastBootUpTime は生だとこういうデータ。
LastBootUpTime: 20091014151549.069803+540
このままだと時刻型だと解釈してくれないんだよね。
時間の都合で試して無いけど、0時-9時に実行して桁が落ちないかちょっと心配。。