2016-10-06 3 views
0

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

$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "C:\temp\test" 
$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:\temp\log.txt" -Append 
} 

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

ответ

1

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

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

[DateTime] $LastWriteTime = (Get-ChildItem -Path "C:\temp\test" -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 Task Scheduler для запуска каждые пять минут.

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

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

+0

Но что, если некоторые удаляют файл перед проверкой? – Richard

+0

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

+0

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

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, если был добавлен файл. Затем вы можете использовать это, чтобы решить, нужно ли отправлять электронную почту.

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

+0

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

+0

@ N.R. Испытали ли вы это, как вы поживаете? – Richard

+0

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

Смежные вопросы