PowerShellでテキストファイル変更を自動検知してGitにコミットする方法

PowerShellは、Windows環境での自動化スクリプト作成に適した強力なツールです。本記事では、特定のテキストファイルをリアルタイムで監視し、変更が検知された際に自動でGitにコミットするシステムの構築方法を解説します。この仕組みを導入することで、ログや設定ファイルの変更履歴を簡単に管理し、作業効率を向上させることが可能です。PowerShellスクリプトの基本から応用例までを網羅しており、初心者から中級者まで役立つ内容を提供します。

目次

PowerShellを使用したテキストファイル監視の基礎


PowerShellには、ファイルやフォルダの変更を監視するための機能が組み込まれています。この機能を利用することで、特定のディレクトリやファイルに変更が加えられた際に自動的に処理を実行できます。

FileSystemWatcherクラスの概要


PowerShellでは、System.IO.FileSystemWatcherクラスを使用してファイルシステムのイベントを監視します。このクラスは以下のようなイベントをサポートします。

  • Changed: ファイルやフォルダが変更されたとき。
  • Created: ファイルやフォルダが新規作成されたとき。
  • Deleted: ファイルやフォルダが削除されたとき。
  • Renamed: ファイルやフォルダがリネームされたとき。

基本的なFileSystemWatcherの設定


以下のコードは、FileSystemWatcherを使用して特定のファイルを監視する基本的な例です。

# FileSystemWatcherオブジェクトの作成
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Path\To\Your\Directory"  # 監視するディレクトリ
$watcher.Filter = "example.txt"              # 監視対象のファイル
$watcher.NotifyFilter = [System.IO.NotifyFilters]'LastWrite'

# イベントハンドラの作成
$onChanged = Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
    Write-Host "ファイルが変更されました: $($Event.SourceEventArgs.FullPath)"
}

# 監視を開始
$watcher.EnableRaisingEvents = $true

Write-Host "ファイル監視を開始しました。"

ファイル変更イベントの基本動作


上記のスクリプトを実行すると、指定されたディレクトリ内のexample.txtが変更された際にメッセージが表示されます。この仕組みを基に、変更内容をGitへコミットする自動化スクリプトを構築していきます。

次のステップでは、監視システムに必要な詳細設定について説明します。

ファイルシステムイベントの設定方法

PowerShellでファイル監視を正確に動作させるためには、FileSystemWatcherクラスの設定を適切に行う必要があります。このセクションでは、フィルタリングや通知設定を活用して、不要なイベントを排除し、効率的な監視を実現する方法を解説します。

監視対象のディレクトリとファイルの設定


PathFilterプロパティを使うことで、監視対象を柔軟に指定できます。

  • Path: 監視するディレクトリを指定します。
  • Filter: 特定のファイル名や拡張子を指定します(例: *.txt)。

以下のコードは、特定のディレクトリ内の全てのテキストファイルを監視する例です。

$watcher.Path = "C:\Path\To\Your\Directory"
$watcher.Filter = "*.txt"

通知フィルタの設定


NotifyFilterプロパティを使用すると、どの種類の変更を監視するかを制御できます。主なオプションは以下の通りです。

  • LastWrite: ファイルの内容が変更された場合。
  • FileName: ファイル名が変更された場合。
  • DirectoryName: ディレクトリ名が変更された場合。

複数の通知を組み合わせることも可能です。

$watcher.NotifyFilter = [System.IO.NotifyFilters]'LastWrite, FileName'

再帰的なフォルダ監視


IncludeSubdirectoriesプロパティを$trueに設定すると、サブディレクトリも含めて監視できます。

$watcher.IncludeSubdirectories = $true

イベントハンドラの追加


イベントハンドラを追加することで、特定のイベントが発生した際にカスタム処理を実行できます。以下は、変更されたファイルのフルパスをログに記録する例です。

Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
    $filePath = $Event.SourceEventArgs.FullPath
    Add-Content -Path "C:\Path\To\LogFile.txt" -Value "Changed: $filePath - $(Get-Date)"
}

監視の開始と終了


監視は、EnableRaisingEventsプロパティを$trueに設定することで開始されます。終了時は、このプロパティを$falseに設定します。

$watcher.EnableRaisingEvents = $true
Write-Host "監視を開始しました。"

# 必要に応じて監視を停止
$watcher.EnableRaisingEvents = $false

適切なリソース管理


監視を停止する際は、Unregister-Eventを使ってイベントハンドラを解除し、リソースを解放してください。

Unregister-Event -SourceIdentifier $onChanged.Name
$watcher.Dispose()

これらの設定を活用することで、効率的で正確なファイル監視を実現できます。次のセクションでは、Gitとの連携方法について解説します。

Gitの初期設定とPowerShellの連携

PowerShellを用いてファイル変更をGitに自動コミットするには、Gitの設定を正しく行い、PowerShellスクリプトで操作できるようにする必要があります。このセクションでは、Gitの初期設定方法とPowerShellとの連携手順を解説します。

Gitのインストールと設定

  1. Gitのインストール:
    Gitがインストールされていない場合は、公式サイトからインストールします。WindowsユーザーはGit Bashが同時にインストールされますが、今回はPowerShellを使用します。
  2. 初期設定:
    Gitを初めて使用する場合は、ユーザー名とメールアドレスを設定してください。
   git config --global user.name "Your Name"
   git config --global user.email "youremail@example.com"
  1. SSHキーの設定(必要に応じて):
    リモートリポジトリにアクセスする際、SSHキーを利用すると便利です。以下のコマンドでSSHキーを生成し、GitHubなどに登録してください。
   ssh-keygen -t rsa -b 4096 -C "youremail@example.com"

Gitリポジトリの作成またはクローン


監視対象のファイルをGitで管理するには、リポジトリを作成するか、既存のリポジトリをクローンします。

  1. 新しいリポジトリの作成:
    PowerShellで以下のコマンドを実行します。
   cd C:\Path\To\Your\Directory
   git init
  1. 既存のリポジトリをクローン:
    リモートリポジトリをクローンする場合は、以下のコマンドを使用します。
   git clone git@github.com:username/repository.git C:\Path\To\Your\Directory

PowerShellからのGitコマンド実行


PowerShellスクリプトでGitコマンドを実行するには、シェル内でGitコマンドをそのまま使用できます。

以下は、変更をコミットしてプッシュする基本的なコマンド例です。

cd C:\Path\To\Your\Directory

# ファイルのステージング
git add example.txt

# コミット
git commit -m "Auto-commit: File updated"

# リモートリポジトリにプッシュ
git push origin main

PowerShellスクリプトへの統合


次に、PowerShellスクリプトにGit操作を組み込みます。以下は、監視対象ファイルの変更を検知してGitに自動コミットする例です。

Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
    $filePath = $Event.SourceEventArgs.FullPath

    # Gitコマンドの実行
    git -C "C:\Path\To\Your\Directory" add $filePath
    git -C "C:\Path\To\Your\Directory" commit -m "Auto-commit: $filePath updated"
    git -C "C:\Path\To\Your\Directory" push origin main

    Write-Host "変更が検知され、Gitにコミットされました: $filePath"
}

テストとデバッグ


スクリプトが期待通りに動作するかをテストします。変更検知からGitへの自動コミットが成功すれば設定完了です。次のセクションでは、エラー処理とログ管理を追加する方法を説明します。

変更検知後にGitへ自動コミットするスクリプト

このセクションでは、テキストファイルの変更を検知し、自動的にGitへコミットするスクリプトを作成します。スクリプトは、変更検知、Git操作、通知を統合したフローで設計します。

自動コミットスクリプトの全体構造


以下は、ファイル変更を検知し、Gitに自動コミットするPowerShellスクリプトの全体構造です。

# FileSystemWatcherの設定
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Path\To\Your\Directory"  # 監視ディレクトリ
$watcher.Filter = "*.txt"                   # 対象ファイル
$watcher.NotifyFilter = [System.IO.NotifyFilters]'LastWrite'

# イベントハンドラの作成
$onChanged = Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
    try {
        # 変更検知したファイルのパスを取得
        $filePath = $Event.SourceEventArgs.FullPath
        Write-Host "変更が検知されました: $filePath"

        # Gitコマンドの実行
        $repoPath = "C:\Path\To\Your\Directory"
        git -C $repoPath add $filePath
        git -C $repoPath commit -m "Auto-commit: $filePath updated"
        git -C $repoPath push origin main

        Write-Host "変更がGitにコミットされました: $filePath"
    }
    catch {
        Write-Host "エラーが発生しました: $_"
    }
}

# 監視を開始
$watcher.EnableRaisingEvents = $true
Write-Host "ファイル監視を開始しました。Ctrl+Cで終了できます。"

# プロセスを停止しないための待機ループ
while ($true) {
    Start-Sleep -Seconds 1
}

スクリプトのポイント解説

1. FileSystemWatcherの設定

  • 監視するディレクトリやファイルの種類(例: *.txt)を指定します。
  • NotifyFilterプロパティで検知対象の変更種類を指定します(例: LastWriteで内容の変更を検知)。

2. Gitコマンドの実行

  • git -C オプションを使い、リポジトリのパスを指定して操作します。
  • ファイルを追加(add)、コミット(commit)、リモートに送信(push)するコマンドを順に実行します。

3. エラー処理

  • try-catch構文を使用して、エラーが発生した場合もスクリプトが停止しないようにします。
  • エラーメッセージをログに記録したり、通知を送る拡張も可能です。

4. 待機ループ

  • スクリプトが終了しないよう、無限ループで待機します。Ctrl+Cで停止できます。

スクリプトの実行と確認

  1. PowerShellでスクリプトを実行します。
  2. 監視対象ディレクトリの.txtファイルを変更して動作を確認します。
  3. Gitリポジトリでコミットログやリモートリポジトリを確認し、自動コミットが成功していることを検証します。

次のセクションでは、エラー処理やログ管理の詳細を解説します。これにより、スクリプトの信頼性をさらに向上させます。

エラー処理とログ管理の実装

自動化スクリプトの信頼性を高めるためには、エラー処理とログ管理が重要です。このセクションでは、PowerShellスクリプトにエラー処理を組み込み、操作ログを記録する方法を解説します。

エラー処理の実装

エラーが発生してもスクリプトが中断しないようにするには、try-catch構文を活用します。これにより、予期せぬエラーが発生した場合でも適切に対応できます。

# イベントハンドラ内でエラー処理を実装
$onChanged = Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
    try {
        # ファイルパスの取得
        $filePath = $Event.SourceEventArgs.FullPath
        Write-Host "変更が検知されました: $filePath"

        # Gitコマンドの実行
        git -C $repoPath add $filePath
        git -C $repoPath commit -m "Auto-commit: $filePath updated"
        git -C $repoPath push origin main

        Write-Host "変更がGitにコミットされました: $filePath"
    }
    catch {
        Write-Host "エラーが発生しました: $_"
        Add-Content -Path "C:\Path\To\ErrorLog.txt" -Value "Error: $($_.Exception.Message) - $(Get-Date)"
    }
}
  • tryブロック: 正常な処理を実行します。
  • catchブロック: エラー発生時の処理を記述します。エラーの内容をログファイルに記録することで、後で原因を特定できます。

ログ管理の実装

スクリプトの動作状況を確認できるように、操作ログを記録します。これには、PowerShellのAdd-Contentコマンドレットを使用します。

# ログを記録する関数
function Write-Log {
    param (
        [string]$Message
    )
    $logFile = "C:\Path\To\LogFile.txt"
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path $logFile -Value "$timestamp - $Message"
}

# ログ記録の例
Write-Log "ファイル監視を開始しました。"

ログ記録の統合


イベントハンドラ内で、Git操作やエラー発生時にログを記録します。

$onChanged = Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
    try {
        $filePath = $Event.SourceEventArgs.FullPath
        Write-Log "変更が検知されました: $filePath"

        git -C $repoPath add $filePath
        git -C $repoPath commit -m "Auto-commit: $filePath updated"
        git -C $repoPath push origin main

        Write-Log "変更がGitにコミットされました: $filePath"
    }
    catch {
        Write-Log "エラー: $($_.Exception.Message)"
    }
}

エラー通知の実装(オプション)

エラーが発生した際に通知を送ることで、問題にすぐ対応できるようにします。以下は、メール通知を送信する例です。

function Send-ErrorNotification {
    param (
        [string]$ErrorMessage
    )
    Send-MailMessage -From "you@example.com" -To "admin@example.com" -Subject "スクリプトエラー発生" -Body $ErrorMessage -SmtpServer "smtp.example.com"
}

catch {
    $errorMessage = "エラーが発生しました: $($_.Exception.Message)"
    Write-Log $errorMessage
    Send-ErrorNotification -ErrorMessage $errorMessage
}

定期的なログファイルの管理

ログファイルが大きくなりすぎるのを防ぐため、古いログを削除する機能を追加します。

# ログファイルのクリーンアップ
function Cleanup-Logs {
    param (
        [string]$LogDirectory,
        [int]$DaysToKeep = 7
    )
    Get-ChildItem -Path $LogDirectory -Filter "*.txt" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$DaysToKeep) } | Remove-Item
}

# 毎日のクリーンアップ処理
Cleanup-Logs -LogDirectory "C:\Path\To" -DaysToKeep 7

エラー処理とログ管理を統合することで、スクリプトの信頼性とメンテナンス性を向上させることができます。次のセクションでは、応用例として複数ファイルやフォルダの監視方法を紹介します。

応用例: 複数ファイルやフォルダの監視

PowerShellを使用すると、複数のファイルやフォルダを同時に監視することができます。このセクションでは、複数の対象を効率的に監視する方法と、監視システムを柔軟に拡張するための手法を解説します。

複数フォルダを監視する方法

複数のフォルダを監視する場合、それぞれにFileSystemWatcherインスタンスを作成し、イベントハンドラを登録します。以下はその例です。

# 監視するディレクトリのリスト
$directories = @("C:\Path\To\Directory1", "C:\Path\To\Directory2")

# 監視する拡張子
$filter = "*.txt"

# 各ディレクトリの監視設定
foreach ($directory in $directories) {
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = $directory
    $watcher.Filter = $filter
    $watcher.NotifyFilter = [System.IO.NotifyFilters]'LastWrite'
    $watcher.IncludeSubdirectories = $true

    # イベントハンドラの登録
    Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
        try {
            $filePath = $Event.SourceEventArgs.FullPath
            Write-Host "変更が検知されました: $filePath"

            # Gitコマンドの実行
            git -C $directory add $filePath
            git -C $directory commit -m "Auto-commit: $filePath updated"
            git -C $directory push origin main

            Write-Host "変更がGitにコミットされました: $filePath"
        }
        catch {
            Write-Host "エラーが発生しました: $_"
        }
    }

    # 監視を開始
    $watcher.EnableRaisingEvents = $true
    Write-Host "監視を開始しました: $directory"
}

複数ファイル形式を監視する方法

FileSystemWatcherFilterプロパティは1種類のファイル形式しか指定できませんが、複数のファイル形式を監視するには、それぞれの形式に対応する監視インスタンスを作成します。

# 対象とするファイル形式
$fileFilters = @("*.txt", "*.log")

# 各ファイル形式ごとに監視を設定
foreach ($filter in $fileFilters) {
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "C:\Path\To\Your\Directory"
    $watcher.Filter = $filter
    $watcher.NotifyFilter = [System.IO.NotifyFilters]'LastWrite'

    # イベントハンドラを設定
    Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
        $filePath = $Event.SourceEventArgs.FullPath
        Write-Host "変更が検知されました: $filePath"
    }

    # 監視を開始
    $watcher.EnableRaisingEvents = $true
}
Write-Host "複数ファイル形式の監視を開始しました。"

監視対象の動的追加と削除

監視対象を動的に追加または削除する場合、監視リストを管理する仕組みを構築します。以下は、対象フォルダをPowerShellスクリプト内で追加・削除する例です。

# 監視リストを管理する配列
$watchers = @()

# 監視対象を追加する関数
function Add-Watch {
    param (
        [string]$Path,
        [string]$Filter = "*.txt"
    )
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = $Path
    $watcher.Filter = $Filter
    $watcher.NotifyFilter = [System.IO.NotifyFilters]'LastWrite'
    $watcher.IncludeSubdirectories = $true

    Register-ObjectEvent -InputObject $watcher -EventName Changed -Action {
        Write-Host "変更が検知されました: $($Event.SourceEventArgs.FullPath)"
    }

    $watcher.EnableRaisingEvents = $true
    $watchers += $watcher
    Write-Host "監視対象を追加しました: $Path"
}

# 監視対象を削除する関数
function Remove-Watch {
    param (
        [string]$Path
    )
    $watcher = $watchers | Where-Object { $_.Path -eq $Path }
    if ($watcher) {
        $watcher.EnableRaisingEvents = $false
        $watcher.Dispose()
        $watchers = $watchers | Where-Object { $_.Path -ne $Path }
        Write-Host "監視対象を削除しました: $Path"
    } else {
        Write-Host "指定された監視対象が見つかりません: $Path"
    }
}

応用例の活用シナリオ

  1. ログ管理: 複数のアプリケーションログをリアルタイムで監視し、変更を記録してGitにコミット。
  2. バックアップ: 特定フォルダのファイル変更を検知し、自動で履歴を保存。
  3. チーム開発: 各メンバーが作業中のファイルを監視し、共有リポジトリに自動コミット。

これにより、複雑なファイル監視の要件に対応し、柔軟な自動化システムを構築できます。次のセクションでは、記事全体のまとめを行います。

まとめ

本記事では、PowerShellを活用して特定のテキストファイルを監視し、変更を検知した際に自動的にGitにコミットするシステムの構築方法を解説しました。

PowerShellのFileSystemWatcherを使用してリアルタイムでファイル変更を監視し、Gitコマンドを組み合わせてバージョン管理を自動化する仕組みを構築することで、手動作業を削減し、作業効率を大幅に向上させることができます。

さらに、エラー処理やログ管理の追加、複数ファイルやフォルダの監視、動的な監視対象の追加など、柔軟性と信頼性を高める方法も紹介しました。これにより、さまざまなニーズに対応する自動化システムが実現可能です。

これらのスクリプトやテクニックを応用して、作業環境をさらに効率化してください。PowerShellの強力な機能を活用することで、日々のタスクをより簡単かつ効果的に管理できるでしょう。

コメント

コメントする

目次