2015-11-03

PowerShellでストップウォッチを自作する

今回は、PowerShellから.NET FrameworkのStopWatchクラスとTimerクラスを使用して、オリジナルのストップウォッチを作成します。

<今回の完成品>


できるだけシンプルなものにしています。
開始ボタンを押すと測定が始まり、もう一度押すと測定を停止します。
測定を停止するとリセットボタンが押下可能となり、それを押すと経過時間をリセットします。

それではスクリプトを記述します。


---------ここから-------------------------------------------------------------------------------------
# ストップウォッチ

# アセンブリの読み込み
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#ストップウォッチ
$Watch = New-Object System.Diagnostics.Stopwatch

#タイマー
$Timer = New-Object System.Windows.Forms.Timer
$Timer.Interval = 10
$Time = {
    $Now = $Watch.Elapsed
    $Label.Text = "$Now".substring(0,11)
}
$Timer.Add_Tick($Time)

# フォームの作成
$Time_Form = New-Object System.Windows.Forms.Form
$Time_Form.Size = "190,170"
$Time_Form.font = New-Object System.Drawing.Font("メイリオ",9)
$Time_Form.StartPosition = "CenterScreen"
$Time_Form.MinimizeBox = $False
$Time_Form.MaximizeBox = $False
$Time_Form.TopLevel = $True
$Time_Form.Text = "ストップウォッチ"

# 時間表示ラベル
$Label = New-Object System.Windows.Forms.Label
$Label.Location = "10,10"
$Label.Size = "150,50"
$Label.text = "00:00:00.00"
$Label.Font = New-Object System.Drawing.Font("メイリオ",16)
$Label.textAlign = "MiddleCenter"

# 開始・停止兼用ボタン
$Button = New-Object System.Windows.Forms.Button
$Button.Location = "10,70"
$Button.Size = "70,50"
$Button.Text = "開 始"
$Click = {
    IF ( $Watch.IsRunning -eq $False ) #ストップウォッチが起動していない時 = 計測を開始
    {
        $Timer.Start()
        $Watch.Start()
        $Button.Text = "停 止"
    }else{ #ストップウォッチが起動している時 = 計測を停止
        $Timer.Stop()
        $Watch.Stop()
        $ResetButton.Enabled = $true
        $Button.Text = "再 開"
    }
}
$Button.Add_Click($Click)

# リセットボタン
$ResetButton = New-Object System.Windows.Forms.Button
$ResetButton.Location = "90,70"
$ResetButton.Size = "70,50"
$ResetButton.Text = "リセット"
$ResetButton.Enabled = $False
$Reset = {
    $Label.text = "00:00:00.00"
    $Watch.Reset()
    $Button.Text = "開 始"
    $ResetButton.Enabled = $False
}
$ResetButton.Add_Click($Reset)

# フォームに各アイテムを設置 
$Time_Form.Controls.AddRange(@($Label,$Button,$ResetButton))

# フォームを表示
$Time_Form.ShowDialog()
---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付けて、実行してみてください。
完成品と同じものが表示されるはずです。

それでは解説をしていきます。
また過去の記事で解説した部分については割愛致します。

内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。


*****解説*****************************************************************************

#ストップウォッチ
$Watch = New-Object System.Diagnostics.Stopwatch

ここではまずStopWatchクラスを使用する宣言を行っています。
(この時点ではまだ測定を開始していません)

測定を開始する場合はStartメソッド、測定を停止する場合はStopメソッド、経過時間をリセットする場合はResetメソッドを使用します。
今回の例では、Startメソッド・Stopメソッドを「開始・停止兼用ボタン」のクリックイベントに、Resetメソッドは「リセット」ボタンのクリックイベントにそれぞれ仕込んでいます。
StopWatchクラスのプロパティには、経過時間の合計を返すElapsedプロパティや、実行中か否かを返すIsRunningプロパティなどがあります。


#タイマー
$Timer = New-Object System.Windows.Forms.Timer
$Timer.Interval = 10
$Time = {
    $Now = $Watch.Elapsed
    $Label.Text = "$Now".substring(0,11)
}
$Timer.Add_Tick($Time)

ここでは、Timerクラスを使用する宣言を行っています。
Timerクラスは「一定時間内に繰り返し処理を発生させる」場合に使用するものです。
今回の使い方としては、一定時間内(今回は0.01秒毎)にStopWatchクラスの経過時間を取得し、ラベルのテキストに落としこむようになっています。

TimerクラスのIntervalプロパティはTickイベントを発生させる間隔をミリ秒で指定します。(1秒は1000ミリ秒)

なお今回は、取得した経過時間の先頭から11文字をラベルのテキストに指定しています。
つまり「00:00:00.00」の状態です。
取得した経過時間をそのままラベルのテキストとした場合は、「00:00:00.0000000」となります。


各ボタンのクリックイベントについは、解説を省略させていただきます。
イベントの記述方法についてはこちらをご覧ください。

*******************************************************************************************************

Timerクラスは、上記の通り「一定時間に処理を繰り返す」ことができます。
これを使うと例えば、1秒毎に画像を切り替えたり、作業開始から1時間経過したらメッセージを表示するなど、アイデア次第で様々なことに使えると思いますので、ぜひ 遊んで 勉強してみてください。

=======================================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=======================================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=======================================================================
スポンサーリンク


0 件のコメント:

コメントを投稿

疑問・質問・リクエスト お気軽にどうぞ (^O^)/