ピッシーのメモ帳

気になった情報の保管庫

Windowsでシステムの稼働時間を確認する方法

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は秒を意味する。

learn.microsoft.com

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型を返すことが分かった。

learn.microsoft.com

以下、公式ページより引用。

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の仕様かバグだと思われる。