【Powershell】進捗状況を表示する方法

スポンサーリンク
GUI
スポンサーリンク

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 初版公開

コメント

タイトルとURLをコピーしました