Powershell: опция фильтра FileSystemWatcher - не работает. - PullRequest
0 голосов
/ 11 октября 2018

Я хотел бы следить за файлами с такими именами, как «сегодняшняя дата, затем 6 цифр, а затем _ABC_XYZ.csv».Например, если сегодняшняя дата 20181011, то файл должен иметь имя: 20181011123456_ABC_XYZ.csv.Ниже приведен мой код:

$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} 

Мои запросы:

  1. Кажется, что $ watcher.filter не работает, так как он принимает файлы, отличные от указанного вфильтр тоже.

  2. Также я бы хотел посмотреть 2 папки одновременно, поскольку файл может находиться в любой из папок.Как мне этого добиться?

1 Ответ

0 голосов
/ 11 октября 2018

Как указывало @Theo, свойство Filter не поддерживает регулярное выражение.Допускаются только подстановочные знаки пути.

Вам нужно будет использовать более простой подстановочный знак в своем фильтре:

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

.., а затем выполнить более конкретную (регулярное выражение) проверку в своем обработчике:

$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
  }    
}

Что касается другого каталога, @vrdse уже указал, что для этого вам понадобится второй наблюдатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...