Windows TIPS
[PowerShell]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

PowerShellで進ちょく状況をプログレス・バーで表示する

解説をスキップして操作方法を読む

山田 祥寛
2008/05/02
対象ソフトウェア
Windows PowerShell
処理時間の長いスクリプトを実行する場合、何も表示せずにユーザーを待たせるのは不親切である。
処理中にプログレス・バーを表示することで、スクリプトが確かに動作していることをユーザーは視覚的に確認できる。
PowerShellのWrite-Progressコマンドレットを利用すれば、視覚的なプログレス・バーを簡単に作成できる。

解説

 PowerShellで処理時間の長いスクリプトを実行する場合、何も表示せずに、ただユーザーを待たせるのは不親切だ。ユーザーは処理が実際に行われているのか不安に思うだろうし、短気なユーザーであれば、数秒間何も動作しない(ように見える)スクリプトは、クラッシュしていると思い込んで強制的に終了しようとするかもしれない。

 そこで、処理が数秒以上に及ぶようなスクリプトを実行する場合は、プログレス・バー(進ちょくバー)を表示するようにしておくのがよいだろう。これによって、エンドユーザーはスクリプトがクラッシュしておらず、確かに継続して実行されていることを確認できるし、処理が現時点で何割程度完了しているのか(あとどの程度の時間がかかりそうなのか)を把握することができる。

 PowerShellではこのようなプログレス・バーを生成するために、Write-Progressという専用コマンドレットを用意している。これを利用すれば、最低限のパラメータ指定だけで視覚的なプログレス・バーをスクリプトに組み込むことができる。

 それではさっそく、具体的なサンプル・コードを見ていくことにしよう。ここでは、別TIPS「PowerShellでテンプレートを使ってメールを一斉配信する」で紹介したMailTransfer.ps1スクリプトに対して、メールの送信状況を表すプログレス・バーを追加してみよう。

操作方法

 *注意
PowerShellを利用するには、あらかじめシステムにユーザー自身がインストールしておく必要があります。具体的なインストール方法については「PowerShellをインストールする」を参照してください。

手順1――テキスト・エディタでPowerShellのコードを入力する

 まずはテキスト・エディタ(メモ帳でも何でもよい)を開き、以下のコードを入力してほしい。なお「#」で始まる行は、コードの意味を解説するためのコメント部分なので、省略してもよい。コメントには、スクリプトの簡単な説明を入れておいた。

 なお、本稿ではプログレス・バーにかかわる部分(リスト内の太字部分)のみを解説する。メール送信のロジックそのものについては、先のTIPS記事の解説を参照していただきたい。

※ファイル:Progress.ps1

$smtp = "smtp.examples.com"
$from = "Xxxxxx@examples.com"
$subject = "WINGS NEWS[2008/05/05]PowerShell TIPS連載開始"

$db = New-Object Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\tmp\mail.mdb")
$comm = New-Object System.Data.OleDb.OleDbCommand("SELECT * FROM mail", $db)
# mailテーブル内のレコード件数(アドレス件数)を取得
$comm2 = New-Object System.Data.OleDb.OleDbCommand("SELECT COUNT(*) FROM mail", $db)
$db.Open()
$rs = $comm.ExecuteReader()
$num = $comm2.ExecuteScalar()

$cli = New-Object Net.Mail.SmtpClient($smtp)
$body = [String]::join("`r`n", (Get-Content mail.dat))

# 何通目のメールを送信しているのかをカウントするための変数$cntを定義
$cnt = 1;
while($rs.Read()){
  $mail = New-Object Net.Mail.MailMessage($from, $rs["email"])
  $mail.Subject = $subject
  $tmp = $body
  for($i=0; $i -lt $rs.FieldCount; $i++){
    $tmp = $tmp -replace ("{" + $rs.GetName($i) + "}"), $rs.GetString($i)
  }
  $mail.Body = $tmp
  $mail.SubjectEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")
  $mail.BodyEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")
  $cli.Send($mail)
 
# 進捗のパーセンテージを求める
    $p = $cnt / $num * 100;
# プログレス・バーを表示
    Write-Progress "Mail Transfer" ([String]$p + "%") -percentComplete $p
# 処理を500ミリ秒だけ休止(サンプルの動作を確認するためのダミー)
  Start-Sleep -milliseconds 500
# メール件数をカウントする変数$cntをカウントアップ
  $cnt++;

}
$db.Close()
サンプル・ファイルProgress.ps1およびサンプル・データ・ファイルをダウンロードするには、ここをクリックしてください。

 PowerShellスクリプトの実行ファイルは拡張子を「.ps1」とする必要がある。ファイル名自体は何でも構わないが、ここでは「Progress.ps1」という名前で保存しておこう。

 コード全体の流れについてはリスト内のコメントをご覧いただくとして、ここで注目してほしいのは次の2点だ。

1.プログレス・バーを表示するのはWrite-Progressコマンドレット
  冒頭で述べたように、PowerShell上でプログレス・バーを表示するのは、Write-Progressコマンドレットの役割だ。プログレス・バーを表示するために最低限必要な構文は次のとおりである(利用可能な全パラメータについては、PowerShellのヘルプを参照していただきたい)。

Write-Progress [-activity] 動作状況を表す文字列 [-status] 現在の状態を表す文字列 [-percentComplete 進ちょくパーセンテージ] [-secondsRemaining 残り時間]

 -activity/-statusパラメータは、それぞれプログレス・バーの先頭行と2行目に表示する文字列である。ここでは、-statusプロパティに進ちょく状況に応じてパーセンテージ表示用の文字列をセットしている。また、サンプルのリストではこれらパラメータ名は省略しているが、もちろん、構文のように明示的に「-activity」「-status」と指定してもよい。

 -percentCompleteパラメータはプログレス・バーの進ちょく割合を示すためのパラメータである。リストではこちらのパラメータを使用しているが、処理の残り時間を表したい場合には-secondRemainingパラメータを指定することもできる。

2.処理を休止するのはStart-Sleepコマンドレット
  プログレス・バーの表示には直接関係はないが、本サンプルでは進ちょく状況の変化について確認しやすいように、スクリプト内にダミーの休止処理を挟んでいる。実際のスクリプトでは(もちろん)この処理はカットすべきであるが、その場合、処理が一瞬で終わってしまい、プログレス・バーが表示されない可能性もあるので、注意すること。

 PowerShellで処理を一時的に休止するのは、Start-Sleepコマンドレットの役割である。Start-Sleepコマンドレットの基本的な構文は次のとおりだ(利用可能な全パラメータについては、PowerShellのヘルプを参照していただきたい)。

Start-Sleep {[-seconds] 休止する秒数|-milliseconds 休止するミリ秒数}

 処理を休止する時間は、-secondsパラメータか-millisecondsパラメータのいずれかで指定できる。-secondsパラメータはパラメータ名を省略可能であるが、-millisecondsパラメータはパラメータ名まで明示する必要があるので、注意すること。

手順2――PowerShellのスクリプト・コードを実行する

 Progress.ps1を実行するには、PowerShellのプロンプトを開いたうえで、以下のようにコマンドを実行すればよい(カレント・フォルダにスクリプトが保存されているものとする*)。

PS > ./Progress.ps1

* PowerShellでスクリプト・ファイルを実行する場合には、あらかじめいくつかの設定を行っておく必要がある。詳細については、「Windows PowerShellコマンド&スクリプティング入門(後編)」を参照していただきたい。

 その際、先のTIPS記事で紹介したmail.datがProgress.ps1と同一のフォルダ中に存在しない場合や、指定したSMTPサーバやデータベース・ファイルへのパスなどが間違っている場合などには、スクリプトが正しく動作しない可能性があるので、注意すること。Progress.ps1を実行して、次のようなプログレス・バーが表示されれば成功である。End of Article

プログレス・バーの使用例
スクリプト実行時に、処理進行に従ってプログレス・バーが表示され、進ちょく状況や残り時間などを把握しやすくなる。
動作状況のタイトル文字列。
進ちょく状況の%表示。
進ちょく状況のバー表示。

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間
ソリューションFLASH