How to Monitor Folder Changes and Trigger Scripts via Windows Task Scheduler


3 views

When automating file system workflows in Windows Server environments, developers often need to execute scripts when files are modified, created, or deleted within a directory tree. The native Windows Task Scheduler can accomplish this through event-based triggers rather than time-based schedules.

The most reliable approach combines these components:

# PowerShell script template (Save as Watch-Folder.ps1)
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\root"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

Register-ObjectEvent $watcher "Changed" -Action {
    # Your custom logic here
    Start-Process "C:\scripts\processor.exe"
}

Create a scheduled task with these critical settings:

1. Trigger: "On an event"
2. Log: "Microsoft-Windows-PowerShell/Operational"
3. Source: "PowerShell"
4. EventID: "4104" (Script block execution)

Windows Task Scheduler processes events as follows:

  • Events trigger tasks immediately by default
  • Concurrent executions queue when "Do not start a new instance" is selected
  • Multiple rapid changes may coalesce into single triggers

For production environments, consider this robust solution:

# Enhanced watcher script with deduplication
$lockFile = "C:\temp\proc.lock"
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Filter = "*.*"
$watcher.Path = "C:\root"
$watcher.IncludeSubdirectories = $true

$action = {
    if (-not (Test-Path $lockFile)) {
        New-Item $lockFile -Type File | Out-Null
        try {
            & "C:\scripts\process_changes.ps1"
        }
        finally {
            Remove-Item $lockFile
        }
    }
}

Register-ObjectEvent $watcher "Created" -Action $action
Register-ObjectEvent $watcher "Changed" -Action $action
Register-ObjectEvent $watcher "Deleted" -Action $action

For complex scenarios, consider:

  • Windows Management Instrumentation (WMI) events
  • Third-party directory monitors like Directory Monitor Pro
  • Custom .NET applications using FileSystemWatcher class

When working with file systems on Windows Server, there are frequent scenarios where you need to execute scripts automatically whenever files are added, modified, or deleted within a directory tree. While Task Scheduler is excellent for time-based triggers, event-based triggers require a different approach.

Windows doesn't natively support folder tree monitoring through Task Scheduler alone. However, we can combine several technologies:

# PowerShell script to monitor directory changes
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\root"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

Register-ObjectEvent $watcher "Changed" -Action {
    # Your script execution logic here
    Start-Process "C:\scripts\your_script.bat"
}

Here's how to implement a robust monitoring system:

  1. Create a PowerShell monitoring script (as shown above)
  2. Set up a scheduled task to run the script at system startup
  3. Configure the script to run continuously in the background

For the subquestion about event queuing: Windows Task Scheduler does queue triggered tasks when the system is busy. However, multiple rapid file changes might generate more events than the system can process immediately.

A better approach is to implement a cooldown period in your script:

$cooldownPeriod = 60 # seconds
$lastRunTime = 0

Register-ObjectEvent $watcher "Changed" -Action {
    $currentTime = [int][double]::Parse((Get-Date -UFormat %s))
    if (($currentTime - $lastRunTime) -gt $cooldownPeriod) {
        # Execute your script
        Start-Process "C:\scripts\process_files.bat"
        $lastRunTime = $currentTime
    }
}

For more complex scenarios, consider:

  • Windows Services: Create a dedicated service for monitoring
  • Third-party tools: Tools like Directory Monitor or FolderChangesView
  • WMI Events: Using __InstanceModificationEvent for more granular control

When implementing these solutions, remember to test thoroughly with different file operations (create, modify, delete, rename) to ensure your trigger behaves as expected across all scenarios.