Фильтры 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
}
}
}