PowerShell で フォルダー・ファイルの監視(非同期処理)

前回はフォルダー・ファイルの監視を同期方式で処理してみましたが、今回は非同期で処理してみたいと思います。

監視として使用するクラスは、前回同様に System.IO.FileSystemWatcher を使用します。また非同期処理の部分は、イベントを使用します。
 
PowerShellでは イベントハンドラ の設定をする際にイベント名の頭に「Add_」と付け加える必要があります。よって、今回は Created というイベントを作りますので Add_Created という表記になります。
Get-Member で MemberType が Event の Name を調べてみると下図のように Add_ とはなっていませんのでご注意ください。
2009112523_383 
 
■サンプル
C:tempフォルダにテキストファイルが作成されたことを検出します。

try
{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
    $frm = New-Object System.Windows.Forms.form
    $frm.WindowState = [System.Windows.Forms.FormWindowState]::Minimized
    $frm.ShowInTaskbar = $false

    $watcher = New-Object System.IO.FileSystemWatcher      # FileSystemWatcherの作成
    $watcher.Path = "C:temp"                              # 監視対象のフォルダ指定
    $watcher.Filter = "*.txt"                              # フィルター
    $watcher.NotifyFilter = [System.IO.NotifyFilters]::FileName
    $watcher.SynchronizingObject = $frm

    # イベント(非同期処理)
    $watcher.Add_Created({
        Write-Host $_.Name
        $watcher.EnableRaisingEvents = $false             # 監視終了
        Write-Host "----- 監視終了 -----"
        $frm.Dispose()
    })

    Write-Host "----- 監視開始 -----"
    $watcher.EnableRaisingEvents = $true                  # 監視開始
    [void]$frm.showdialog()
}
catch [Exception]
{
    Write-Host $_.Extension
}

 
■補足
上記のサンプルでは、FileSystemWatcher の SynchronizingObject プロパティにフォームのオブジェクトを設定していますが、これを設定していないと、下図のような感じでイベント発生時に実行空間が無いためエラーが発生します。 
2009112522_382

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です