新年あけましておめでとうございます。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」(時間差や時間間隔に対応するオブジェクト)に変換することで、書式などを付けて扱えるようになる。それにはキャストを使う。
具体的には、
[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を使って書式設定する場合、書式設定文字以外は、すべて“\”を使ってエスケープしておく必要がある点だ。
この連載の記事
-
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 - この連載の一覧へ