はじめに
PowerShellでGUIアプリが作れるらしいと聞き、今までイベントビューアや自作のExcelマクロで確認していたPCの起動/シャットダウン時刻をPowerShellでGUIアプリとして実現してみました。
指定した日付でイベントログを取得し、その日の一番早いPC起動時刻/ログイン時刻、一番遅いログオフ時刻/シャットダウン時刻を表示させます。
イベントコードの割り当ては以下のとおりです。このコードと日付をもとにイベントログから検索をしてくるわけです。
使用したイベントコードはこちら!
- 6005:PCの起動
- 6006:シャットダウン
- 7001:ログオン
- 7002:ログオフ
開発環境💻
- OSエディション:Windows 10 Pro
- OSバージョン:20H2
- OSビルド:19042.630
- Powershellバージョン:5.1.18362.1171
ソースコード
FromStartupToShutdown.ps1
using namespace System.Windows.Forms
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# ラベル
#region Label
$lbl1 = New-Object Label
$lbl1.Text = "検索日付:"
$lbl1.Location = "15, 30"
$lbl1.AutoSize = $True
$lbl2 = New-Object Label
$lbl2.Text = "起動:"
$lbl2.Location = "15, 60"
$lbl2.AutoSize = $True
$lbl3 = New-Object Label
$lbl3.Text = "ログイン:"
$lbl3.Location = "15, 90"
$lbl3.AutoSize = $True
$lbl4 = New-Object Label
$lbl4.Text = "ログオフ:"
$lbl4.Location = "15, 120"
$lbl4.AutoSize = $True
$lbl5 = New-Object Label
$lbl5.Text = "シャットダウン:"
$lbl5.Location = "15, 150"
$lbl5.AutoSize = $True
#endregion
# 入力欄
#region Date
$Date = New-Object System.Windows.Forms.DatetimePicker
$Date.location = "100,30"
$Date.Format = "Long"
$Date.AutoSize = $True
$Date.Width = 150
#endregion
# 出力欄
#region TextBox
$txt1 = New-Object TextBox
$txt1.location = "100,60"
$txt1.Width = 100
$txt2 = New-Object TextBox
$txt2.location = "100,90"
$txt2.Width = 100
$txt3 = New-Object TextBox
$txt3.location = "100,120"
$txt3.Width = 100
$txt4 = New-Object TextBox
$txt4.location = "100,150"
$txt4.Width = 100
$txtTemp = New-Object TextBox
#endregion
# 確認ボタン
#region Button
$btn = New-Object Button
$btn.Text = "確認"
$btn.Size = "150, 40"
$btn.Location = "100, 180"
$btn.AutoSize = $True
#endregion
# ボタンのクリック処理
$button_Click = {
#マウスカーソル:待機状態
[System.Windows.Forms.Cursor]::Current = [System.Windows.Forms.Cursors]::WaitCursor
#検索結果格納
$txt1.Text = getEventLog(6005)
$txt2.Text = getEventLog(7001)
$txt3.Text = getEventLog(7002)
$txt4.Text = getEventLog(6006)
#マウスカーソル:デフォルト
[System.Windows.Forms.Cursor]::Current = [System.Windows.Forms.Cursors]::Default
}
$btn.Add_Click($button_Click)
function getEventLog($eventId)
{
$dd = $Date.Value.Day
if ($dd.toString().length -eq 1) {
$dd = "0" + $Date.Value.Day
}
$MM = $Date.Value.Month
if ($MM.toString().length -eq 1) {
$MM = "0" + $Date.Value.Month
}
$replace = "@{TimeGenerated="+$MM+"/"+$dd+"/"+$Date.Value.Year+" "
$before = $Date.Value.Date + " 23:59:59"
$after = $Date.Value.Date + " 00:00:00"
$txtTemp.Text = ""
try
{
$eventLog = GET-EVENTLog System -After $after -before $before| Where-Object{$_.EventId -eq $eventId} | select-Object TimeGenerated
If(($eventId -eq "6005") -or ($eventId -eq "7001"))
{
$length = $eventLog.Length
$txtTemp.Text = $eventLog[$length - 1]
}
Else {
$txtTemp.Text = $eventLog[0]
}
$txtTemp.Text = $txtTemp.Text.Replace($replace,"").Replace("}","")
}
catch
{
Write-host $eventId"取得結果なし"
}
return $txtTemp.Text
}
# フォーム
#region Form
$f = New-Object Form
$f.Text = "起動から終了まで"
$f.Size = "330, 270"
$f.MaximumSize =$f.Size
$f.MinimumSize =$f.Size
$f.MaximizeBox = $false
$f.MinimizeBox = $false
$f.StartPosition = "CenterScreen"
$f.Controls.AddRange(@($lbl1,$lbl2,$lbl3,$lbl4,$lbl5,$Date,$txt1,$txt2,$txt3,$txt4,$btn))
$f.ShowDialog()
#endregion
実行例
以下コマンドを実行します。
↓↓コピペ用↓↓
powershell -NoProfile -ExecutionPolicy Unrestricted .\FromStartupToShutdown.ps1
最後に、この記事が「いいね!」と思ったらLooks Good To Me!ボタンのクリックとフォローの方よろしくお願いします!!