このページの本文へ

前へ 1 2 次へ

Windows Info 第308回

PowerShellでWindowsが起動してからの時間を計算する

2022年01月02日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

PowerShellは、時間や日付を扱うことができるため、時刻や時間の計算を簡単にできる。Windows付属の電卓アプリは、日付の計算は可能だが、時刻を含めることができない。PowerShellならインストールも不要だ

 新年あけましておめでとうございます。1年の始まりだからというわけもないが、今回は、時刻と時間の計算をPowerShellでする方法を解説する。

 Windows 10では、Windows Updateや機能の追加などを除くと、再起動する機会が少なくなった。とはいえ、長期間起動し続けているといまだに不具合が起こりやすい。筆者も1~2週間に1回程度は、意識的に再起動するようにしているが、忘れてしまうこともある。

 こうしたとき、再起動してからの時間を表示できると便利だ。Linux/Unixには、システムの起動日時とこれまでの時間を表示するuptimeというコマンドがある。残念ながら、Windowsにはこのコマンドはない。

Windowsの稼働時間を求める方法は大きく2つある

 Windowsが再起動してからこれまでの時間を求める方法は大きく2つある。1つは、記録された再起動時刻を使って、現在時刻から求める方法だ。もう1つは、Windows時間と呼ばれるシステムタイマーによる計測時間を使う方法だ。前者は計算が必要だが、後者は不要である。

 PowerShellでこのWindows時間を得るには、“[Environment]::TickCount”を使う。返ってくるのは、ミリ秒単位のWindowsが起動してからの経過時間を表す整数値である。

 “[Environment]::TickCount”は、PowerShellのコマンドではなく、.NET Frameworkのオブジェクトである。正確には“[System.Environment]::TickCount”で、オブジェクトのクラス名が“System.Environment”、“TickCount”はプロパティ名だ。

●Environment.TickCount プロパティ
 https://docs.microsoft.com/ja-jp/dotnet/api/system.environment.tickcount?view=netframework-4.8

 このようにPowerShellのメリットの1つは、.NET Frameworkのオブジェクトに簡単にアクセスできるところだろう。PowerShellでは、クラス名先頭の“System.”部分を省略できる。

TimeSpanで人間にもわかりやすい形で時間を表す

 とはいえ、ミリ秒単位の時間では通常の人間にはどれくらいの時間が経ったのか想像がつきにくい。得られる値は単なる整数値だが、これを.NET Frameworkの「TimeSpan」(時間差や時間間隔に対応するオブジェクト)に変換することで、書式などを付けて扱えるようになる。それにはキャストを使う。

Windowsが稼働している時間は、“[Environment]::TickCount”で求めることができる。これを時間を表すTimeSpanオブジェクトにキャストすれば、書式設定などもできるようになる

 具体的には、

[TimeSpan][Int64](1E4*[Environment]::TickCount)

というように先頭に“[TimeSpan][int64]”を付ける。“[TimeSpan]”は、左側をTimeSpanに見なすというキャスト、同様に“[Int64]”は、左側を64bitの整数値に見なすというもの。

 キャストとはラベルの付け替えだ。「お前はTimeSpanだ。TimeSpanになるのだ」といえばInt64はTimeSpanになる。ただしキャストとデータには一定の関係が必要。たとえて言えば、伊達直人はタイガーマスクにキャストできるが、ミスターXはタイガーマスクにキャストできない。

 なぜTickCountを10000倍(1E4は1×10の4乗の意味)しているのかというと、TimeSpanのTickは、100ナノ秒(1ナノ秒は10のマイナス9乗秒。100ナノ秒は10のマイナス7乗)単位になっている。TickCountは1ミリ秒(1ミリ秒は10のマイナス3乗秒)単位であり、これを100ナノ秒単位に変換するには10の4乗(=10000)を乗ずる。もし計算したい値が秒単位ならば10000000(1E7)倍する。

 TimeSpanオブジェクトに関しては、Microsoftのサイトに説明がある。

●TimeSpan
 https://docs.microsoft.com/ja-jp/dotnet/api/system.timespan?view=netframework-4.8

 TimeSpanオブジェクトになると、日付や時間関連の書式指定が可能になる。具体的には、

([TimeSpan][int64](1E4*[Environment]::TickCount)).ToString('c')

 とすると、日、時、分、秒、ミリ秒で区切った表示になる。細かく設定したければ、

([TimeSpan][int64](1E4*[Environment]::TickCount)).ToString('dd\日\ hh\時\間\ mm\分\ s\秒')

などとすることも可能。注意する必要があるのは、ToStringを使って書式設定する場合、書式設定文字以外は、すべて“\”を使ってエスケープしておく必要がある点だ。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン