Показать полную графическую версию : Проверка времени нахождения файла с расширением .eml в папке
День добрый, возможно ли с помощью bat реализовать следующее:
Имеется папка с подпапками и файлами(imap папка), в нее сваливаются сообщения с расширением .eml, если текущее время больше времени создания файла на 5 минут, то это должно записываться в лог файл с указанием времени, даты и имени файла(все имена сообщений уникальны), и далее желательно чтобы этот файл больше не проверялся, иначе как я понимаю лог будет огромный... Заранее огромное спасибо за любую помощь в данном вопросе!
А если меньше?
В чём смысл ведения подобного лога?
Если меньше, то ничего не предпринимать, смысл в том что есть 2 человека которые следят за этой почтой, и они частенько на нее забивают, и по пол дня письма не уходят клиентам... Начальство требует делать отчет по письмам которые они не отправили в течении 5 минут. Просто оповещения на компе о письмах не проканывают, они на них либо забивают, либо не замечают.
П.С. вся исходящая почта компании сначало сваливается в эту папку для проверки, а потом уже перекидывается на отправку...
kotlyar, а в чем проблема отправлять письма автоматически? Не дочитал:
вся исходящая почта компании сначало сваливается в эту папку для проверки, а потом уже перекидывается на отправку... »
Просто оповещения на компе о письмах не проканывают, они на них либо забивают, либо не замечают. »
В таком случае, какой смысл в логе? Как раньше «клали», так и теперь будут. Вопрос нужно решать мерами организационного характера.
Я это озвучивал руководству, но все таки требуют лог... Есть ли все таки возможность реализовать это?
Есть ли все таки возможность реализовать это? »
Если я правильно понял логику работы «клиентов», то она выглядит в моём представлении следующим образом: в папке появляются (создаются в ней, копируются или перемещаются в неё) файлы. Затем они проверяются «клиентами» и в неизменном виде перемещаются в другую папку. Мы можем отследить момент создания файла в папке и момент удаления файла из папки. Без подкаталогов, увы. Кстати, а сколько их там?
Клиенты в почте создают новое сообщение, MDaemon по фильтру обрабатывает данное сообщение и помещает его в imap папку для проверки, файлы он кидает с расширением .eml, у тех кто проверяет эти письма, они отображаются во входящих с возможностью просмотра отправителя, получателя, текста сообщения и вложения, если сообщение проходит проверку, то его перемещают в папку "Разрешенные" и оттуда батник переносит их на отправку. Следовательно время помещения файла в папку = времени создания файла, другие файлы в данной папке и каталоги трогать не надо, подкаталогов в этой папке 7. Впринципи меня бы устроило если бы батник отслеживал момент появления файла в папке и момент его удаления, а уже из лога вытаскивать записи где разница больше 5 минут.
подкаталогов в этой папке 7. »
Придётся на каждый из них заводить отслеживание. Итого, вместе с «корневым», будет 8. Давайте для начала попробуем только сам «корневой» каталог:
в imap папку для проверки »
если лог будет — увеличим время опроса и добавим вложенные (для отслеживания нескольких придётся заводить асинхронное отслеживание). Если согласны — то я попробую.
Перепутал, подкаталогов 10, итого вместе с корневой 11. А зачем на них заводить отслеживание? мне надо чтоб следил батник только за корневой папкой.
Вот как выглядит папка. Название папки допустим sib.biz.imap, путь до папки c:\MDaemon\Public Folders\sib.biz.IMAP
kotlyar, то есть, за файлами во вложенных в «корневой» каталог папках «*-.IMAP» мы не следим, так?
да, и за двумя файлами Hiwater.mrk, Imap.mrk, тоже не следим. только за файлами в корне sib.biz.imap
да, »
Ясно.
и за двумя файлами Hiwater.mrk, Imap.mrk, тоже не следим. »
Ну, это понятно — у них ведь расширение не «.eml».
Что ж, сие гораздо проще. Делаем.
Это радует, жду с нетерпением!)
kotlyar, вот примерная болванка кода:
Option Explicit
Dim strSourceFolder
Dim objFSO
Dim strComputer
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemSink
strSourceFolder = "C:\Песочница\052\sib.biz.imap"
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strSourceFolder) Then
strComputer = "."
Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set objSWbemSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
With objSWbemServicesEx.Get("Win32_Directory.Name='" & Replace(strSourceFolder & "\.", "\", "\\") & "'")
objSWbemServicesEx.ExecNotificationQueryAsync objSWbemSink, _
"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE " & _
"TargetInstance ISA 'CIM_DataFile' AND " & _
"TargetInstance.Drive = '" & .Drive & "' AND " & _
"TargetInstance.Path = '" & .Path & "' AND " & _
"TargetInstance.Extension = 'eml'"
Do
WScript.Sleep 100
Loop
objSWbemSink.Cancel
Set objSWbemSink = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
End With
Else
WScript.Echo "Source folder [" & strSourceFolder & "] not found."
WScript.Quit 1
End If
Set objFSO = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub Sink_OnObjectReady(objSWbemObjectEx, objSWbemAsyncContext)
With objSWbemObjectEx
Select Case .Path_.Class
Case "__InstanceCreationEvent"
WScript.Echo Now() & " | | Create: [" & .TargetInstance.Name & "]"
Case "__InstanceDeletionEvent"
WScript.Echo Now() & " | | Delete: [" & .TargetInstance.Name & "]"
End Select
End With
End Sub
'=============================================================================
Запускать под «cscript.exe». Здесь я сделал просто вывод даты/времени и имени файла для того, чтобы оценить работоспособность скрипта и верность нашего подхода.
Насчёт записи в лог-файл. Писать-то мы можем. Но далее будет проблема, как оттуда корректно и эффективно извлечь эту информацию. Я бы предпочёл писать в базу данных. У Вас есть SQL-сервер? Можем его использовать?
kotlyar, а приведённый выше скрипт отрабатывает в консоли? Корректно?
Еще не проверял, не был на работе сегодня.
kotlyar, здравствуйте. Испытайте пакетный файл:
@echo off
set "folder=C:\MDaemon\Public Folders\sib.biz.IMAP"
set span=300
set "mask=*.eml"
echo $$$>"%temp%\$$$1.tmp"
md "%temp%\$$$" 2>nul
:#
dir /a-d/b "%folder%\%mask%" 2>nul| findstr /livg:"%temp%\$$$1.tmp">"%temp%\$$$2.tmp"
(
for /f "usebackq delims=" %%i in ("%temp%\$$$2.tmp") do (
set /a count+=1
start "" /b cmd /v:on /c "set date_time=!date! !time!& (for /f %%j in ('set /a span+1') do @ping -n %%j localhost>nul)& (if exist "%folder%\%%i" echo %%i: !date_time! ... !date! !time!>"%temp%\$$$\!count!.log")& exit /b"
)
)|| (
for /f %%i in ('
"tasklist| findstr /bil cmd.exe| find /c /v """
') do (
if %%i leq 2 (
for /f %%j in ('
"dir /b "%temp%\$$$"| find /c /v """
') do (
for /l %%k in (1 1 %%j) do (
type "%temp%\$$$\%%k.log">>"report.log"
del "%temp%\$$$\%%k.log"
)
)
)
)
set count=
)
type "%temp%\$$$2.tmp">>"%temp%\$$$1.tmp"
goto:#
.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.