Фильтры Powershell IO.FileSystemWatcher

Я создал 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'}

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

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

Спасибо

2 ответа

Решение

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

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

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

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

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

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

$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
        }
    }
}
Другие вопросы по тегам