Linuxでシステムの稼働時間を取得するにはuptimeコマンドを使うが、Windowsではこのコマンドは使えない。
Windowsでシステムの稼働時間を取得するには、以下の方法がある。
Get-Uptimeコマンドレット
PowerShellでGet-Uptime
と入力する。
おそらくこれが一番簡単だが、残念ながらGet-Uptime
はPowerShell 6以降に追加されたコマンドレットなのでWindowsに付属のPowerShell(Windows PowerShell 5.1)では使えない。
PS C:\> Get-Uptime
Days : 0
Hours : 1
Minutes : 38
Seconds : 21
Milliseconds : 0
Ticks : 59010000000
TotalDays : 0.0682986111111111
TotalHours : 1.63916666666667
TotalMinutes : 98.35
TotalSeconds : 5901
TotalMilliseconds : 5901000
少し見づらいが、Daysは日、Hoursは時、Minutesは分、Secondsは秒を意味する。
Win32_OperatingSystemクラス
Get-Uptime
は、WMIのWin32_OperatingSystemクラスを参照している。そのため、Windows PowerShellでもこのクラスを利用して稼働時間を計算することはできる。
以下のコードでは、変数$uptimeに稼働時間を計算している。
$wmi_os = Get-WmiObject win32_OperatingSystem #起動時刻 $lastboottime = $wmi_os.LastBootUpTime $boottime = $wmi_os.ConvertToDateTime($lastboottime) #現在時刻 $localdatetime = $wmi_os.LocalDateTime $nowtime =$wmi_os.ConvertToDateTime($localdatetime) #稼働時間 $uptime =$nowtime - $boottime
起動時刻はwin32_OperatingSystemクラスのLastBootUpTimeプロパティ、現在時刻はLocalDateTimeプロパティから取得できる。
計算した稼働時間は、以下のようにGet-Uptime
と同じような形で表示される。
PS C:\> echo $uptime
Days : 0
Hours : 1
Minutes : 47
Seconds : 59
Milliseconds : 222
Ticks : 64792220080
TotalDays : 0.074990995462963
TotalHours : 1.79978389111111
TotalMinutes : 107.987033466667
TotalSeconds : 6479.222008
TotalMilliseconds : 6479222.008
補足
DateTime型への変換は必要か
起動時刻と現在時刻を取得後にConvertToDateTime関数を使っているが、「時刻を取得したのならDateTime型のはずなのに、なぜConvertToDateTime関数で型変換するの?」と思うかもしれない。
実は、LastBootUpTimeプロパティやLocalDateTimeプロパティで取得した時刻は、変数に入れるとDateTime型ではなくString型になってしまう。*1
#ConvertToDateTime関数を使用しない場合
PS C:\> $wmi_os = Get-WmiObject win32_OperatingSystem
PS C:\> $lastboottime = $wmi_os.LastBootUpTime
PS C:\> $lastboottime.GetType().FullName
System.String
変数のデータ型はGetType関数で取得できる。時刻なのにString型っておかしくね?と思うが…。
この件について公式ページを確認すると、LastBootUpTimeプロパティとLocalDateTimeプロパティはDateTime型を返すことが分かった。
以下、公式ページより引用。
LastBootUpTime
データ型: datetime
アクセスの種類: 読み取り専用
オペレーティング システムが最後に再起動された日時。
このプロパティは CIM_OperatingSystem から継承されます。
LocalDateTime
データ型: datetime
アクセスの種類: 読み取り専用
修飾子: MappingStrings ("MIB.IETF|HOST-RESOURCES-MIB.hrSystemDate", "MIF.DMTF|General Information|001.6")
ローカルの日付と時刻のオペレーティング システム バージョン。
このプロパティは CIM_OperatingSystem から継承されます。
PowerShellでは、変数のデータ型は入れる値によって自動的に設定される。おそらく、そのときにString型だと判別されてしまったのだろう。
このままでは稼働時間を計算できないので、DateTime型への変換が必要になる。
#ConvertToDateTime関数で型変換した場合
PS C:\> $boottime = $wmi_os.ConvertToDateTime($lastboottime)
PS C:\> $boottime.GetType().FullName
System.DateTime
タスクマネージャ
コマンドからは離れるが、タスクマネージャで確認できる。
1.タスクマネージャを起動し、詳細表示にする。
2.「パフォーマンス」タブを開き、画面左側の「CPU」を押す。
3.画面下部に稼働時間が表示される。
おわりに
Windowsでは意外と稼働時間を確認するのに手こずった。ただ単に稼働時間を見るだけでいいのなら、タスクマネージャから確認するのが一番早いかもしれない。
*1:PowerShell 7ではちゃんとDateTime型になるので、Windows PowerShellの仕様かバグだと思われる。