#.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. Но с вашими требованиями вам, возможно, придется.