---
title: PowerShellによるファイル監視スクリプトの解説
url: 'https://automationse.net/explaining-powershell-file-monitoring-script'
markdown: 'https://automationse.net/explaining-powershell-file-monitoring-script.md'
date: '2024-01-30'
description: 'このプログラムは、PowerShellを使用して特定のファイル（この場合は "C:test.csv"）の変更を監視し、ファイルに変更が加えられた際に通知を行うスクリプトです。それぞれの部分の役割は以下の通りです。 FileSystemWatcherオブジェクトの作成: $filePath = "C:test.csv" $watcher = New-Object System.IO.FileSystem…'
taxonomy:
  category:
    - IT関連
  tag:
    - PowerShell
---

## [PowerShellによるファイル監視スクリプトの解説](https://automationse.net/explaining-powershell-file-monitoring-script)

  公開日 2024.01.30 更新日 2024.01.30  [PowerShell](https://automationse.net/tag:PowerShell#body-wrapper)  

 このプログラムは、PowerShellを使用して特定のファイル（この場合は "C:test.csv"）の変更を監視し、ファイルに変更が加えられた際に通知を行うスクリプトです。それぞれの部分の役割は以下の通りです。

### **FileSystemWatcherオブジェクトの作成**:

```
$filePath = "C:test.csv"
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = [System.IO.Path]::GetDirectoryName($filePath)
$watcher.Filter = [System.IO.Path]::GetFileName($filePath)
$watcher.NotifyFilter = [System.IO.NotifyFilters]::LastWrite
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
```

`FileSystemWatcher`は、指定したディレクトリまたはファイルの変更を監視するためのクラスです。このコードは、指定したファイルのディレクトリとファイル名を設定し、ファイルの最終書き込み時刻の変更を監視するように設定しています。サブディレクトリは監視せず、イベントの発生を有効化しています。

### **変更検出時のアクション定義**:

```
#イベントデバウンスのための変数設定
$global:lastEventTime = [DateTime]::MinValue

# 変更が検出された際のアクション
$action = {
    param($source, $event)
    # イベントのデバウンス（一定時間内のイベントは無視）
    $timeSinceLastEvent = [DateTime]::Now - $global:lastEventTime

    if ($timeSinceLastEvent.TotalSeconds -lt 5) {
        return
    }
    $global:lastEventTime = [DateTime]::Now

    # イベント情報を取得
    $changeType = $event.ChangeType
    $fileName = $event.FullPath
    $timeStamp = $event.TimeGenerated
    Write-Host "ファイルが更新されました: $fileName at $timeStamp ($changeType)"
}
```

ポイントとして、イベントの「デバウンス（抑制）」を制御するためのグローバル変数を設定しています。これにより、短時間に複数回発生するイベントを無視することができます。

ファイル変更時に実行されるアクションを定義しています。イベントが短時間（5秒未満）に複数回発生した場合、それを無視します。変更が検出されたら、ファイル名とタイムスタンプを含むメッセージを表示します。

##### 背景：ファイルシステム監視の挑戦

ファイルシステム監視は、指定されたファイルやディレクトリの変更を追跡し、それらの変更に基づいて特定のアクションを実行するプロセスです。これは通常、`FileSystemWatcher`のようなツールを使用して行われます。しかし、このプロセスではいくつかの挑戦に直面することがあります。

##### 問題点：多重イベントの発生

ファイルやディレクトリに変更が加えられた際、システムはしばしば一つ以上の通知イベントを生成します。これは、ファイルの保存や更新が複数の操作（ファイルの開閉、書き込み、メタデータの更新等）に分割されるためです。その結果、同じイベントが短時間内に複数回トリガされる可能性があります。

#### デバウンスの必要性

1. **イベントの過剰反応を防止**: 多重イベントが発生すると、監視システムが過剰に反応し、不必要なアクションを繰り返し実行することがあります。これはシステムリソースの無駄遣いにつながり、予期しないエラーや問題を引き起こす可能性があります。
2. **パフォーマンスの最適化**: デバウンスを使用することで、監視システムは一定時間内に重複するイベントを無視し、パフォーマンスを最適化することができます。これにより、システムは実際に重要なイベントにのみ反応し、無関係なノイズをフィルタリングします。
3. **正確なイベントハンドリング**: デバウンスにより、システムはファイルやディレクトリの最終的な状態に基づいてのみアクションを実行します。これにより、部分的な更新や一時的な変更によって誤った反応を起こすことがなくなります。

### **イベントハンドラの登録**:

1. ここで、`FileSystemWatcher`オブジェクトに対して`Changed`イベントが発生したときに実行するアクションを登録しています。これにより、ファイルに変更が加えられると、定義したアクションが自動的に実行されます。

このスクリプトは、ファイルの監視と自動通知のためのシンプルかつ効果的な方法を提供します。PowerShellスクリプトの自動化やシステム監視タスクにおいて便利に使用できます。

 [ Previous Post](https://automationse.net/powershell-datagridview-drag-drop-checkbox) [Next Post ](https://automationse.net/powershell-file-monitoring-notification-system)

---

## Navigation

- Parent: [WordPress Import](https://automationse.net/wordpress-import.md)
- Previous: [PowerShellを活用したファイル監視と通知システムの構築](https://automationse.net/powershell-file-monitoring-notification-system.md)
- Next: [PowerShellとDataGridViewでのドラッグ＆ドロップとチェックボックス操作の実装](https://automationse.net/powershell-datagridview-drag-drop-checkbox.md)
