第31章. イベント・ハンドリング
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
31.0 はじめに
システム管理の多く は反応型である。システムサービスがシャットダウンしたとき、ファイルが作成または削除されたとき、Windowsレジストリに変更が加えられたとき、あるいは時間間隔が設定されたときに何らかのアクションを起こす。
システムの変更に対応する最も簡単な方法は、単純にポーリングすることだ。ファイルが作成されるのを待っているなら、それが現れるまで時々チェックすればいい。プロセスの開始を待っている場合は、Get-Process コマンドレットを呼び出し続けるだけだ。
しかし、レジストリやファイルシステム全体など、システムの巨大な部分を監視する必要がある場合には、すぐに破綻してしまう。
システム変更のポーリングに代わるものとして、多くのテクノロジーがイベントと呼ばれる自動通知をサポートしている。アプリケーションがこれらの自動通知に登録すると、ポーリングする必要がなくなり、発生と同時に対応できるようになる。
.NETはあるメソッドを定義し、WMIは別のメソッドを定義している。独自のイベントを生成したいスクリプトがある場合、どちらの技術も選択肢を提供していない。
PowerShellは、イベント関連コマンドレットの単一で一貫したセットを導入することで、この複雑さに対処している。これらのコマンドレットを使用すると、これらすべての異なるイベント ソースを操作できる。イベントが発生すると、PowerShellにその通知をイベントキューに保存させたり、Action スクリプトブロックを使用して自動的に処理させることができる:
PS > "Hello" > file.txt
PS > Get-Item file.txt
Directory: C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2/21/2010 12:57 PM 16 file.txt
PS > Get-Process notepad
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
64 3 1140 6196 63 0.06 3240 notepad
PS > Register-CimIndicationEvent Win32_ProcessStopTrace `
-SourceIdentifier ProcessStopWatcher `
-Action {
if($EventArgs.NewEvent.ProcessName -eq "notepad.exe")
{
Remove-Item c:\temp\file.txt
}
}
PS > Stop-Process -n notepad
PS > Get-Item c:\temp\file.txt
Get-Item : Cannot find path 'C:\temp\file.txt' because it does not exist.
PowerShellのイベント処理をベースにすることで、刻々と変化するシステムに素早く反応するスクリプトを書くことができる。
31.1 自動的に発生するイベントに対応する ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access