PowerShellスクリプトの処理にかかる時間(進捗状況)を見える化できるとユーザーに優しい
PowerShellでありがちな処理として、大量のファイルの操作(重複チェックや削除、移動など)があると思う。
しかし、これらの処理は時間がかかることが多く、スクリプト実行後中々完了しないと利用者としては「本当に問題なく進んでいるのか?」「トラブルが起きて止まってしまっているのではないか?」と不安に感じてしまう。
ユーザーがこういった不安を感じにくいようにする工夫として進捗状況(プログレスバー)を表示できるようにするとよい。
こんなやつ↓
適用方法 Write-Progressを用いる
考え方として、進捗状況の表示には以下の要素を取得できる必要がある。
- 進捗判定のための「全体数」
- 進捗判定のための「処理完了数」
全体数に対して、処理完了数がどれだけ増えたかによって、進捗状況を%表示するのが
Write-Progressというコマンドレットである。
処理完了数の増加については、ForEach-ObjectやWhileのような繰り返し文のなかにカウンターを設けることで実現する。
簡単にコード化すると、以下のような感じ。
#全体数。ここでは10と決め打ちしている。
$TotalNumber = 10
#処理完了数。初期値は0とする。
$counter = 0
#進捗状況をプログレスバーだけでなく数字でも表すために、分母として全体数を文字列として定義(取得)した変数を用意する。
$denominator = "/"+[string]$TotalNumber
#ここからプログラム処理。ここではWhile文を用いて「counterの値がTotalNumberより小さい間は処理を繰り返す」としている
while($counter -lt $TotalNumber) {
#1処理完了毎にcounterをカウントアップさせる。
$counter ++;
#処理完了数 / 全体数を進捗状況とするので、予め変数として規定しておく
$per = ($counter / $TotalNumber * 100)
#ここが進捗状況(プログレスバー)の設定行。 -activityはプログレスバーの表記名。
#-statusは処理中の処理状況を数値でも表したい場合に設定する。ここでは、counter / 分母(denominator)としている。
#-percentCompleteがプログレスバーを作る部分。「処理完了数 / 全体数」である変数$perを指定している。
Write-Progress -activity "進捗状況" -status $counter$denominator -percentComplete $per
#本来ここから処理したい内容を記載していく。本サンプルでは単純に「1処理毎に1秒待つ」という内容にしてプログレスバーを見やすくしている。
Start-Sleep -s 1
echo $counter"回目の処理です"
}
実行イメージ
上のコードを実行すると、このような見た目になる。
当ブログで紹介している各種スクリプトでも、実際にWrite-Progressを用いて進捗状況表示を行っている。何個かリンクを貼っておくので、よければ参考にしていただきたい。
注意点と補足
PowerShellが実行可能な環境である必要があります。
改版履歴
2021/05/13 サンプルツールの紹介を追記
2021/02/15 初版公開
コメント