Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Проверка времени нахождения файла с расширением .eml в папке (http://forum.oszone.net/showthread.php?t=286688)

kotlyar 19-08-2014 03:46 2391051

Проверка времени нахождения файла с расширением .eml в папке
 
День добрый, возможно ли с помощью bat реализовать следующее:
Имеется папка с подпапками и файлами(imap папка), в нее сваливаются сообщения с расширением .eml, если текущее время больше времени создания файла на 5 минут, то это должно записываться в лог файл с указанием времени, даты и имени файла(все имена сообщений уникальны), и далее желательно чтобы этот файл больше не проверялся, иначе как я понимаю лог будет огромный... Заранее огромное спасибо за любую помощь в данном вопросе!

Iska 19-08-2014 07:31 2391072

А если меньше?

В чём смысл ведения подобного лога?

kotlyar 19-08-2014 07:39 2391073

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

Iska 19-08-2014 08:31 2391082

kotlyar, а в чем проблема отправлять письма автоматически? Не дочитал:
Цитата:

Цитата kotlyar
вся исходящая почта компании сначало сваливается в эту папку для проверки, а потом уже перекидывается на отправку... »

Цитата:

Цитата kotlyar
Просто оповещения на компе о письмах не проканывают, они на них либо забивают, либо не замечают. »

В таком случае, какой смысл в логе? Как раньше «клали», так и теперь будут. Вопрос нужно решать мерами организационного характера.

kotlyar 19-08-2014 08:49 2391084

Я это озвучивал руководству, но все таки требуют лог... Есть ли все таки возможность реализовать это?

Iska 19-08-2014 09:58 2391105

Цитата:

Цитата kotlyar
Есть ли все таки возможность реализовать это? »

Если я правильно понял логику работы «клиентов», то она выглядит в моём представлении следующим образом: в папке появляются (создаются в ней, копируются или перемещаются в неё) файлы. Затем они проверяются «клиентами» и в неизменном виде перемещаются в другую папку. Мы можем отследить момент создания файла в папке и момент удаления файла из папки. Без подкаталогов, увы. Кстати, а сколько их там?

kotlyar 19-08-2014 10:12 2391111

Клиенты в почте создают новое сообщение, MDaemon по фильтру обрабатывает данное сообщение и помещает его в imap папку для проверки, файлы он кидает с расширением .eml, у тех кто проверяет эти письма, они отображаются во входящих с возможностью просмотра отправителя, получателя, текста сообщения и вложения, если сообщение проходит проверку, то его перемещают в папку "Разрешенные" и оттуда батник переносит их на отправку. Следовательно время помещения файла в папку = времени создания файла, другие файлы в данной папке и каталоги трогать не надо, подкаталогов в этой папке 7. Впринципи меня бы устроило если бы батник отслеживал момент появления файла в папке и момент его удаления, а уже из лога вытаскивать записи где разница больше 5 минут.

Iska 19-08-2014 10:21 2391115

Цитата:

Цитата kotlyar
подкаталогов в этой папке 7. »

Придётся на каждый из них заводить отслеживание. Итого, вместе с «корневым», будет 8. Давайте для начала попробуем только сам «корневой» каталог:
Цитата:

Цитата kotlyar
в imap папку для проверки »

если лог будет — увеличим время опроса и добавим вложенные (для отслеживания нескольких придётся заводить асинхронное отслеживание). Если согласны — то я попробую.

kotlyar 19-08-2014 10:30 2391118

Перепутал, подкаталогов 10, итого вместе с корневой 11. А зачем на них заводить отслеживание? мне надо чтоб следил батник только за корневой папкой.

kotlyar 19-08-2014 10:39 2391122

Вложений: 1
Вот как выглядит папка. Название папки допустим sib.biz.imap, путь до папки c:\MDaemon\Public Folders\sib.biz.IMAP

kotlyar 19-08-2014 10:46 2391126

Вложений: 1
вот с письмами...

Iska 19-08-2014 10:56 2391135

kotlyar, то есть, за файлами во вложенных в «корневой» каталог папках «*-.IMAP» мы не следим, так?

kotlyar 19-08-2014 11:00 2391136

да, и за двумя файлами Hiwater.mrk, Imap.mrk, тоже не следим. только за файлами в корне sib.biz.imap

Iska 19-08-2014 14:11 2391234

Цитата:

Цитата kotlyar
да, »

Ясно.

Цитата:

Цитата kotlyar
и за двумя файлами Hiwater.mrk, Imap.mrk, тоже не следим. »

Ну, это понятно — у них ведь расширение не «.eml».

Что ж, сие гораздо проще. Делаем.

kotlyar 20-08-2014 10:06 2391605

Это радует, жду с нетерпением!)

Iska 22-08-2014 17:25 2392800

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 25-08-2014 01:57 2393604

Да есть, mssql 2008

Iska 25-08-2014 02:52 2393613

kotlyar, а приведённый выше скрипт отрабатывает в консоли? Корректно?

kotlyar 25-08-2014 11:02 2393678

Еще не проверял, не был на работе сегодня.

Georgio 26-08-2014 00:46 2394050

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:#


.

kotlyar 26-08-2014 03:08 2394071

Iska, сделал скрипт с .js просит ";", при запуске с расширением .vbs просто ничего не происходит.
Georgio, батник запускается и весит без какой либо активности. ждал около часа, ноль эмоций.

Georgio 26-08-2014 11:52 2394204

kotlyar, загляните в папку "%TEMP%\$$$". Там должны лежать все LOG-файлы. Объединить их можно, применив пакетный файл со следующим кодом:
Код:

@for /f %%i in ('"dir /b "%temp%\$$$"| find /c /v """') do @for /l %%j in (1 1 %%i) do @type "%temp%\$$$\%%j.log">>"report.log"& del "%temp%\$$$\%%j.log"
.


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

Iska 26-08-2014 14:29 2394301

Цитата:

Цитата kotlyar
при запуске с расширением .vbs просто ничего не происходит. »

И не должно происходить, пока в искомом каталоге («strSourceFolder = "C:\Песочница\052\sib.biz.imap"» — Вы его поправили на свой?) не появится или не удалится файл с расширением .eml. Как у Вас с этим?

kotlyar 27-08-2014 01:57 2394628

Iska, я поменял данный путь на свой, и по закидывал и по удалял от туда файлы. что при этом должно было произойти?

Georgio, я проверял этот путь, там создается 2 файла $$$1.tmp и $$$2.tmp, в первом из написанного только $$$, а во втором пусто. и когда проверял, других пакетных файлов не запускал.

Iska 27-08-2014 02:53 2394636

Цитата:

Цитата kotlyar
что при этом должно было произойти? »

Примерно вот это.

kotlyar 27-08-2014 03:55 2394642

Iska, Georgio, блиин сори, там расширение же при создании не .eml(это расширение линка при отправке), а .msg, во я затупил....

Iska, Ваш скрипт отрабатывает корректно, и выводит данные создания-удаления файла.
Georgio, По вашему сценарию, в лог записываются только имена файлов которые попадают в папку, без даты-времени. Файлы закидывал, и удалял спустя 10 минут.
$$$
pd50000016231.msg
pd50000016232.msg
pd50000016233.msg
Это все, что появилось в файле $$$1.tmp.

Iska 27-08-2014 05:39 2394650

Цитата:

Цитата kotlyar
Iska, Georgio, блиин сори, там расширение же при создании не .eml(это расширение линка при отправке), а .msg, во я затупил....
Iska, Ваш скрипт отрабатывает корректно, и выводит данные создания-удаления файла. »

Ага, ясненько, разобрались.

Таперича попробуем нарисовать простенькую запись в базу данных SQL.

kotlyar 27-08-2014 05:59 2394651

кстати mssql стоит на другом хосте... И кстати он вообще ни чем не задействован, просто резерв.

kotlyar 29-08-2014 09:05 2395648

Ну что там, есть какие нибудь мысли?)

Iska 29-08-2014 17:22 2395869

kotlyar, мысли есть. Не доберусь никак до своего SQL Server.

kotlyar 09-09-2014 09:55 2400312

вверх

Iska 09-09-2014 12:35 2400365

kotlyar, пробуйте:
читать дальше »
Код:

Option Explicit

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adFilterNone = 0


Dim strSourceFolder

Dim objFSO
Dim objFile

Dim objConnection
Dim objRecordSet

Dim objSWbemDateTime

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
        Set objConnection    = WScript.CreateObject("ADODB.Connection")
        Set objRecordSet    = WScript.CreateObject("ADODB.Recordset")
        Set objSWbemDateTime = WScript.CreateObject("WbemScripting.SWbemDateTime")
       
        objConnection.Open _
                "Provider=SQLOLEDB;Server=SQL;Database=SampleDatabase;User Id=sa;Password=password;"
       
        objRecordSet.Open "SELECT * FROM Messages", objConnection, adOpenStatic, adLockOptimistic
       
        For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                Select Case LCase(objFSO.GetExtensionName(objFile.Name))
                        Case "msg"
                                objRecordSet.Filter = "CreationDate = '" & objFile.DateCreated & "' AND FileName = '" & objFile.Path & "'"
                               
                                If objRecordSet.RecordCount = 0 Then
                                        objRecordSet.AddNew Array("CreationDate", "FileName"), Array(objFile.DateCreated, objFile.Path)
                                End If
                               
                                objRecordSet.Filter = adFilterNone
                End Select
        Next
       
        objRecordSet.Close
        objConnection.Close
       
       
        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 = 'msg'"
               
                Do
                        WScript.Sleep 100
                Loop
               
                objSWbemSink.Cancel
               
                Set objSWbemSink      = Nothing
                Set objSWbemServicesEx = Nothing
                Set objSWbemLocator    = Nothing
        End With
       
        Set objSWbemDateTime = Nothing
        Set objRecordSet    = Nothing
        Set objConnection    = Nothing
Else
        WScript.Echo "Source folder [" & strSourceFolder & "] not found."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub Sink_OnObjectReady(objSWbemObjectEx, objSWbemAsyncContext)
        objConnection.Open _
                "Provider=SQLOLEDB;Server=SQL;Database=SampleDatabase;User Id=sa;Password=password;"
       
        objRecordSet.Open "SELECT * FROM Messages", _
                objConnection, adOpenStatic, adLockOptimistic
       
        With objSWbemObjectEx
                Select Case .Path_.Class
                        Case "__InstanceCreationEvent"
                                WScript.Echo Now() & " |  | Create:  [" & .TargetInstance.Name & "]"
                               
                                objSWbemDateTime.Value = .TargetInstance.CreationDate
                                objRecordSet.AddNew Array("CreationDate", "FileName"), Array(objSWbemDateTime.GetVarDate, .TargetInstance.Name)
                        Case "__InstanceDeletionEvent"
                                WScript.Echo Now() & " |  | Delete:  [" & .TargetInstance.Name & "]"
                               
                                objSWbemDateTime.Value = .TargetInstance.CreationDate
                                objRecordSet.Filter = "CreationDate = '" & objSWbemDateTime.GetVarDate & "' AND FileName = '" & .TargetInstance.Name & "'"
                               
                                If objRecordSet.RecordCount = 1 Then
                                        objSWbemDateTime.SetFileTime .TIME_CREATED, False
                                        objRecordSet.Update Array("DeletionDate"), Array(objSWbemDateTime.GetVarDate)
                                End If
                               
                                objRecordSet.Filter = adFilterNone
                End Select
        End With
       
        objRecordSet.Close
        objConnection.Close
End Sub
'=============================================================================


Примерный вид таблицы «Messages» в базе данных «SampleDatabase»:

Размер для поля FileName подберите по Вашим данным. Я использовал SQL Server 2000, для других версий/серверов Connection String может отличаться.


Время: 13:27.

Время: 13:27.
© OSzone.net 2001-