Linuxでいうuptime的なことをしたかった。

起動時刻


Linux

Linuxの場合は下記のようにuptime-sを付けるとフォーマットして表示してくれる。

1
2
$uptime -s
2016-12-29 22:36:10

PowerShell

こいつをPowerShellでやろうとすると、下記のような感じ。

1
2
> (Get-WmiObject Win32_OperatingSystem).LastBootUpTime
20170507225100.642790+540

ただ、これだと見にくいのでManagementDateTimeConverterメソッドを使う。

1
2
> [Management.ManagementDateTimeConverter]::ToDateTime((Get-WmiObject Win32_OperatingSystem).LastBootUpTime)
20175722:51:00

稼働時間


Linuxの場合のuptimeのアレ。

Linux

1
2
$uptime
21:12:38 up 133 days, 22:36, 1 user, load average: 0.00, 0.03, 0.01

22:36の部分は「時間」と「分」で、この場合は起動から「133日 22時間 36分」経過しているという意味になる。また、-pオプションをつけるとフォーマットして表示してくれる。

1
2
$uptime -p
up 19 weeks, 22 hours, 40 minutes

ちょっと変わってしまうが…(上記はたまたま7で割り切れているのでdaysの表記がなくなっているが、割り切れない場合は* daysというのも表示される。)

Windows

前述のup 133 days, 22:36の部分をPowerShellで取得したい。

まず、最終的に出来上がったコードはこんな感じ。

1
&{$os=Get-WmiObject win32_operatingsystem;$time=((Get-Date) - $os.ConvertToDateTime($os.lastbootuptime)); $time.Days.ToString() + " days " +  $time.Hours.ToString() + " hours " + $time.Minutes.ToString() + " minutes "}

今回はコマンドプロンプトから呼び出したかったので、その場合はpowershell -Commandで呼び出して、powershellのコマンド部分はダブルクォーテーションで括る。さらにpowershellのコマンド部分のダブルクォーテーションはバックスラッシュでエスケープする。

1
powershell -Command "&{$os=Get-WmiObject win32_operatingsystem;$time=((Get-Date) - $os.ConvertToDateTime($os.lastbootuptime)); $time.Days.ToString() + \" days \" +  $time.Hours.ToString() + \" hours \" + $time.Minutes.ToString() + \" minutes \"}"

ついでなのでちょっとだけ補足説明。
やってるのは現在時刻から起動時刻を引いてるだけ。

1
2
> &{$os=Get-WmiObject win32_operatingsystem;$time=((Get-Date) - $os.ConvertToDateTime($os.lastbootuptime));}
> $time

上記を実行すると、下記の情報が取得できる。

1
2
3
4
5
6
7
8
9
10
11
Days              : 4
Hours : 22
Minutes : 40
Seconds : 8
Milliseconds : 376
Ticks : 4272083766604
TotalDays : 4.94454139653241
TotalHours : 118.668993516778
TotalMinutes : 7120.13961100667
TotalSeconds : 427208.3766604
TotalMilliseconds : 427208376.6604

後はこの中のDaysHoursMinutesを表示するだけ。

ちなみに、起動から4日も経過していないのだが、なぜか4日も経ったことになっている。これは気が向いたら調べる…とおもう。たぶん…

参考


Get-SystemUptime and Working with the WMI Date Format
uptime コマンド | コマンドの使い方(Linux) | hydroculのメモ
Calculating system uptime with PowerShell