sid
sid

Reputation: 129

Powershell: FileSystemWatcher filter option - Not working.

I would like to watch out for files having name like "today's date then 6digits then _ABC_XYZ.csv". For e.g. if today's date is 20181011 then the file should be the name: 20181011123456_ABC_XYZ.csv. Below is my code:

$DateStr = $Date.ToString("yyyyMMdd")

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "E:\\Sid\\source"
    $watcher.Filter = $DateStr + "\d\d\d\d\d\d*_Recon_ForeignExchange.csv"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "D:\log.txt" -value $logline            
              }    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
    Register-ObjectEvent $watcher "Changed" -Action $action
    Register-ObjectEvent $watcher "Deleted" -Action $action
    Register-ObjectEvent $watcher "Renamed" -Action $action
    while ($true) {sleep 5} 

My Queries:

  1. Its seems that the $watcher.filter is not working as it's taking files other than the one given in the filter as well.

  2. Also I would like to watch 2 folders at a time as the file can come in any of the folders. How do I achieve this?

Upvotes: 1

Views: 513

Answers (1)

marsze
marsze

Reputation: 17064

As @Theo pointed out, the Filter property does not support regex. Only path wildcards are allowed.

You will have to use a simpler wildcard in your filter:

# rough wildcard filter
$watcher.Filter = "*_Recon_ForeignExchange.csv"

..and then perform a more specific (regex) check in your handler:

$action = {   
  $path = $Event.SourceEventArgs.FullPath
  # check if the file name has the desired format
  if ((Split-Path $path -Leaf) -match ($DateStr + "\d\d\d\d\d\d*_Recon_ForeignExchange.csv"))
    $changeType = $Event.SourceEventArgs.ChangeType
    $logline = "$(Get-Date), $changeType, $path"
    Add-content "D:\log.txt" -value $logline
  }    
}

As for the other directory, @vrdse already pointed out that you're going to need a 2nd watcher for that.

Upvotes: 2

Related Questions