LastWrite FileSystemWatcher Powershell: уведомление - PullRequest
2 голосов
/ 17 октября 2011

Я хотел бы получить уведомление, когда определенный файл был изменен.Это работает нормально, но я не могу установить NotifyFilter.«не распознается как имя командлета ...» Основная проблема заключается в том, что мой скрипт дважды выполняет мою функцию.Изменение идентифицируется, и тогда я получаю два раза "изменено"

function fileChanged ($text) {
  Write-Host $text 
}

$watcher = New-object System.IO.FileSystemWatcher "C:\Users\test\Desktop\"
$watcher.EnableRaisingEvents = $true
$watcher.Filter="*.txt"
$watcher.NotifyFilter = (System.IO.NotifyFilters.LastWrite)

$changed = Register-ObjectEvent $watcher "Changed"  -Action {
  $txt = "changed"
  filechanged($txt)
}

while($true) {
  echo "wartet"
  $null = $watcher.WaitForChanged("Changed")
  start-sleep -s 2
}

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

измените это в своем коде для объявления notifyfilter:

$watcher.NotifyFilter = [System.IO.NotifyFilters]::LastWrite

Но это не решает проблему, прочитайте это:

Из раздела «Устранение неполадок компонентов FileSystemWatcher» документации VS.NET ...

Несколько созданных событий, сгенерированных для одного действия В некоторых ситуациях вы можете заметить, что одно событие создания генерирует несколько событий Created, которые обрабатываются вашим компонентом. Например, если вы используете компонент FileSystemWatcher для мониторинга создания новых файлов в каталоге, а затем протестируете его с помощью Блокнота для создания файла, вы можете увидеть два сгенерированных события, сгенерированных, даже если был создан только один файл. Это потому, что Блокнот выполняет несколько действий файловой системы в процессе записи. Блокнот записывает на диск пакетами, которые создают содержимое файла, а затем атрибуты файла. Другие приложения могут работать таким же образом. Поскольку FileSystemWatcher отслеживает действия операционной системы, все события, запускаемые этими приложениями, будут обнаружены.

Примечание. Блокнот также может вызывать другие интересные события. Например, если вы используете ChangeEventFilter, чтобы указать, что вы хотите отслеживать только изменения атрибутов, а затем записываете файл в каталоге, который вы просматриваете с помощью Блокнота, вы вызовете событие. Это связано с тем, что Notepad обновляет атрибут Archived для файла во время этой операции.

0 голосов
/ 25 апреля 2013

Нашел следующее было самым простым:

Кредит Дереку Ньютону по адресу: http://dereknewton.com/2011/05/monitoring-file-system-changes-with-powershell/

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $searchPath
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$changed = Register-ObjectEvent $watcher "Changed" -Action {
write-host "Changed: $($eventArgs.FullPath)"
}

0 голосов
/ 17 октября 2011

WaitForChanged явно использует FileSystemWatcher до синхронно ожидания изменений. EnableRaisingEvents выполняет асинхронное ожидание: обработчики событий будут вызываться при изменении чего-либо.

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

...