PowerShellで自動アラート通知ツールを書き直してみた

【勉強中なので書き直しました】

前の記事でZabbixのエラーをリアルタイムでWindows10端末へ通知してお知らせするツールを作成し、記事にしました。

前記事ではVBSでツールを作成したのですが、
PowerShellも現在勉強中なので翻訳しました。

以降は完成したスクリプトと、作成してみて感じたVBSとの違いや感想を記載していきます。
検証環境などの説明は前記事をご参照ください。

【alarm_sound_on_system.ps1】

以下がPowerShellで翻訳したスクリプトです。

alarm_sound_on_system.ps1
### 基本設定
$LOG_FILE="C:\zabbix\Alarm\alarm_on.log"
$LOOPCNT=(Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE Name = 'playloop.exe'").Count
$LOOP_FILE="C:\zabbix\Alarm\playloop.exe"
$WAV_FILE="C:\zabbix\Alarm\zabbix_check.wav"
$LOG_VALUE1=(Get-Date -UFormat "%Y/%m/%d-%H:%M:%S") + "   " + $LOOPCNT
$LOG_VALUE2=(Get-Date -UFormat "%Y/%m/%d-%H:%M:%S") + "   " + $LOOPCNT + "(The maximum of processes has reached. Stop this process.)"

### ログファイルの存在チェック(なければ作成)
if ( {Test-Path $LOG_FILE} -ne "True" ) {
New-Object -Path $LOG_FILE
}

### プロセスの生成(playloop.exeによるループ)
if ( $LOOPCNT -lt 1 ){
 Start-Process -FilePath $LOOP_FILE -ArgumentList $WAV_FILE -WindowStyle Minimized
 ### ログファイルに記録
 Add-Content -Path $LOG_FILE -Value $LOG_VALUE1
} else {
 Add-Content -Path $LOG_FILE -Value $LOG_VALUE2
 Stop-Process -Name playloop
}

### エラー通知画面を表示
[void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")

do {
$INPUT= [Microsoft.VisualBasic.Interaction]::InputBox("エラー通知が届いています。`n自分のIDを入力してください。`n`n例) 012345 <6桁>","アラーム音停止","",100,100)
} while ( $INPUT.Length -ne 6 )

### プロセスの停止
Stop-Process -Name playloop

これをPowerShellで実行すると、
以下の画面がアラーム音と一緒に出てきます。
キャプチャ.PNG

(前と一緒で)意味もなく6桁ちゃんと打たないと閉じない仕様です。
好きです。

【VBSと違う点】

1. 行数の少なさ、コードの直感的なわかりやすさ
二つのコードを比較してもらうとPowerShellの行数の少なさや、
コードが直感的にわかるようになってることがわかると思います。

行数はPowerShellが32行、VBSが123行です。

わかりやすさは主観が混じりますが、
PowerShellはオブジェクトだけではなくコマンドも実装されており、
シェルスクリプトと同じ感覚で作成できるのが個人的にありがたいです。

2. .ps1ファイルはダブルクリック実行不可(セキュリティは強い)
PowerShellファイル(拡張子.ps1)はGUI上からダブルクリックで実行できなくなり、テキストエディタでファイルが開くだけになりました。Microsoft側がセキュリティを高めるために仕様として実装したためです。

そのため本ツールでもタスクスケジューラから実行する際は、
以下のbatchファイルでPowerShellを実行する方法に変更しています。

alarm_sound_on_system.bat
@echo off
powershell -WindowStyle Hidden -ExecutionPolicy RemoteSigned -File "C:\zabbix\Alarm\alarm_sound_on_system.ps1"

PowerShellの起動オプションは様々あるので、詳細を知りたい方は以下のURLをご参照ください。結構あるので自動実行を考えてる時に知っておくと便利です。

■PowerShell.exe コマンドラインのヘルプ

3. PowerShellはbatch経由だと画面非表示で実行できない
項番2の話しの続きですが、batch経由で実行した場合、どうしてもサイレントでPowerShellを実行できません。私の場合、「-WindowStyle Hidden」を指定して非表示モードで実行させていますが、一瞬だけプロンプト画面が表示されてしまいます。
 ※「できるよ?」って人いたらコメントください...。

VBSはサイレントで実行可能です。

4. (課題)インプット画面の仕様について
上にも貼ったエラー画面ですが、
VBSと同じようにVB.NETのINPUTBOXメソッドを利用して作成しましたが、なぜかPowerShell側の画面が小さいです。その影響で文字が見切れるので少し詰めてます。

画面を大きくしたい場合はフォームを作るのが良さそうですが、
めんどくさそうだったので今回はパスしました。また今度ZabbixのMySQLにアクセスして任意のデータを取得するフォーム画面を作成したいと思っているので、その時に本格的に触ります。参考URLだけ貼ります。詳細に説明して頂いており参考になります。

■PowerShellでユーザーフォームを作る - オプション紹介 -

【感想】

私はPowerShellがいいです。使いやすいですね。

ここでは紹介していませんがWindows-Windows間での
リモート作業をCUIでやりたいと思った時、PowerShellのPSSessionやInvoke-Commandが使い勝手良くてオススメです。でも受け手サーバ側での初期設定必須です。

機能が多く、選択肢も非常に多いので、
その分、ハマることも多い気がしますが...。
ex.1) Write-Hostで外部出力できると思ってハマったり...。

VBSもPowerShellもどちらも使えれば最高ですが、
私はこれからはPowerShell寄りに勉強していきたいな、と思いました。

今度は「監視サーバを監視するスクリプト」の方も翻訳してみます。

なにか記事内について感想やご指摘ありましたらコメントください。
読んで頂きありがとうございました。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.