Фильтры Powershell IO.FileSystemWatcher - PullRequest
0 голосов
/ 20 декабря 2018

Я создал IO.filesystemwatcher для мониторинга папки и выполнения действий, когда определенные типы файлов записываются в расположение.Я ищу типы файлов .jpg и .tmp.Я назвал фильтр как переменную, и этот фильтр работает, когда он включает один тип файла, но не два типа.

Код ниже работает правильно:

$filter = '*.jpg'
New-Object IO.FileSystemWatcher $Folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}

Код ниже работает правильно:

$filter = '*.tmp'
New-Object IO.FileSystemWatcher $Folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}

Код ниже НЕ РАБОТАЕТ:

$filter = '*.tmp','*jpg'
New-Object IO.FileSystemWatcher $Folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}

Iтакже пытался $filter = '*.tmp' -or '*jpg'

Я уверен, что есть другой способ сделать это, чтобы заставить его работать, но я не очень хорош в работе с IO.filesystemwatcher.Любые рекомендации приветствуются.

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Фильтр представляет собой одну строку. Вы можете проверить возникшее событие, найти полный путь и сравнить его с вашими фильтрами:

$Script:filter = @('*.txt','*jpg','*.csv')
If($FileWatcher){$FileWatcher.Dispose();$FileWatcher = $null}
$FileWatcher = New-Object System.IO.FileSystemWatcher -Property @{
    IncludeSubdirectories = $true;
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    Path =  'C:\Users\proxb\Desktop\DropBox\'
}
Register-ObjectEvent -InputObject $FileWatcher  -EventName Created -Action {
    Write-Host "File: $($event.SourceEventArgs.FullPath) was $($event.SourceEventArgs.ChangeType) at $($event.TimeGenerated) "
    $Script:filter | ForEach{
        If($event.SourceEventArgs.FullPath -like $_){
            Write-Host "$($event.SourceEventArgs.FullPath) matched $_" 
            #Do something here
        }
    }
}
0 голосов
/ 20 декабря 2018

Свойство .Filter имеет тип [string] и поддерживает только одиночные подстановочные выражения;из документов:

Использование нескольких фильтров, таких как "*.txt|*.doc", не поддерживается.

Похоже, вам придется:

  • либо: следите за изменениями всех файлов, задав для .Filter значение '' (пустая строка), а затем выполните свою собственную фильтрацию в обработчике событий.

  • или: установить отдельный экземпляр наблюдателя для каждого фильтра (шаблон с подстановочными знаками). Спасибо, мххоломон .

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