Мониторинг каталога с помощью FileSystemWatcher

#.net #powershell #filesystemwatcher

#.net #powershell #filesystemwatcher

Вопрос:

У меня есть каталог, который заполняется какой-то программой. Я хотел бы отслеживать этот каталог и проверять, постоянно ли файлы добавляются в каталог. Если, например, в течение 5 минут ни один файл не добавляется в директорию, я хочу получить уведомление. Файлы также удаляются, но мне просто нужно заботиться о новых файлах.
Скрипт будет выполняться около 20 минут каждые три часа.
Код для FileSystemWatcher:

 $watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:temptest"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

$created = Register-ObjectEvent $watcher "Created" -Action {
   write-host "Created: $($eventArgs.FullPath)"
   Get-Date -Format "HH:mm:ss" | Out-File "C:templog.txt" -Append
}
  

Я не знаю, как я мог бы этого добиться, и я благодарен за каждый вклад.

Ответ №1:

У вас может быть запущен отдельный скрипт Task Scheduler , который использует ваш файл журнала, чтобы узнать, был ли создан файл за последние 5 минут.

 $log = Get-Content -Path T:log.txt 
$currentTime = Get-date
$5minutesAgo = $currentTime.AddMinutes(-5)
$FileAdded = $false

foreach($time in $log){
    if((get-date $time) -gt $5minutesAgo){
        $FileAdded = $true
    }
}

If($FileAdded) {
    Write-host "File was added in the last 5mins"
} Else {
    Write-host "No file added in the last 5mins"
    # Add in email code here
}
  

Это позволит просмотреть ваш файл журнала построчно и проверить, было ли время в пределах последних минут файла. Затем он установит переменную $FileAdded на $true значение, если был добавлен файл. Затем вы можете использовать это, чтобы решить, следует ли отправлять электронное письмо или нет.

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

Комментарии:

1. Скрипт выполняется примерно 20 минут каждые три часа. Я протестирую ваше решение и сообщу об этом.

2. @N.R. Вы это тестировали, как у вас получилось?

3. Да, я протестировал его, и он работает так, как ожидалось. Теперь я должен представить его своим коллегам и посмотреть, что они скажут.

Ответ №2:

Сценарии PowerShell плохо подходят для непрерывного запуска и создания отчетов о событиях.

Один из способов добиться того, чего вы хотите, — это использовать такой сценарий:

 [DateTime] $LastWriteTime = (Get-ChildItem -Path "C:temptest" -File | Sort-Object LastWriteTime | Select -Last 1).LastWriteTime
if ($LastWriteTime -le (Get-Date).AddMinutes(-5))
{
    Write-Output "No files added in the last 5 minutes"
    # notify me...
} 
  

и запланируйте запуск скрипта в планировщике задач Windows каждые пять минут.

Он находит самый новый файл, отредактированный в каталоге.

Нет необходимости в FileSystemWatcher

Комментарии:

1. Но что, если кто-то удалит файл перед проверкой?

2. @Richard — Если кто-то вручную удалит файл, LastWriteTime также будет обновлен и может привести к путанице. Но я предполагаю, что OP просто хочет убедиться, что в этот каталог всегда записываются файлы. Вы всегда можете придумать дополнительные варианты использования, которые не рассматриваются.

3. Скрипт будет работать только около 20 минут, а не 24/7. Вполне вероятно, что файлы исчезли до того, как вы проверите, но я просто должен убедиться, что всегда появляются новые файлы. Я протестирую ваше решение и сообщу об этом.

4. Проблема в том, что если файлы удалены, они также редактируют LastWriteTime.

5. Правильно, в этой ситуации решение Ричарда более надежное, я также думал о проверке ваших журналов, но мне понравилась идея вообще не использовать FileSystemWatcher. Но с вашими требованиями вам, возможно, придется.