Войти

Показать полную графическую версию : [решено] Найти и обработать строчку в текстовом файле


KaKTuZ49
02-09-2011, 17:48
Мужики. Будте любезны помочь =)

Есть текстовый файл.

(Таких текстовых файлов- 6 штук)
Надо найти строки :


Следующая публикация CRL
1 сентября 2011 г. 13:50:00

Строчка - "Следующая сертификация" выступает как ключ, от которого следующая строка и будет являться проверяемой.
Сравнить дату и время с нынешней.
(Брать 10 минут с запасом)
(Т.е. если в 13:59 - то нормально.Если 14:00 - то пишем, что просрочена)
(Придётся переводить текстовый формат даты в дату - не знаю как)
Если не просрочена или просрочена - отсылать соответствующее уведомление на почту.
(Скрипт будет запускаться каждые полчаса/час через планировщик задач).

Коротко:

- Найти текст.
- Взять следующую строку.
- Сравнить дату с нынешней. (месяц надо ещё заставить понимать)
- Отправление на почту

SendMessage
03-09-2011, 07:30
Option Explicit

Dim fName
Dim objFSO
Dim txtFile
Dim strLine
Dim strMsg
Dim objCDO
Dim Conf

fName = "маршрут нужного файла"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set txtFile = objFSO.OpenTextFile(fName)

Do While Not txtFile.AtEndOfStream
If InStr(txtFile.ReadLine, "Следующая публикация CRL") Then
strLine = txtFile.ReadLine
Exit Do
End If
Loop

txtFile.Close

If DateDiff("n", CDate(Replace(strLine, "г.", "")), Now) > 9 Then
strMsg = "Просрочена"
Else
strMsg = "Не просрочена"
End If

Set objCDO = WScript.CreateObject("CDO.Message")

objCDO.From = "адрес отправителя"
objCDO.To = "адрес получателя"
objCDO.Subject = "тема сообщения"
objCDO.HTMLBody = strMsg

Set Conf = objCDO.Configuration
Conf("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Conf("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp-сервер отправителя"
Conf("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
Conf("http://schemas.microsoft.com/cdo/configuration/sendusername") = "логин"
Conf("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "пароль"
Conf("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Conf.Fields.Update

objCDO.Send

Set objFSO = Nothing
Set objCDO = Nothing

WScript.Quit
(Таких текстовых файлов- 6 штук) »
Как они расположены? Отправлять по каждому файлу отчет собираетесь или по результату проверки всех скопом?

KaKTuZ49
05-09-2011, 11:36
Доброго начала недели всем.

Как они расположены? »

Они находятся все в одной папке.

Отправлять по каждому файлу отчет собираетесь или по результату проверки всех скопом? »

Впринципе, без разницы. Хотелось для начала просто реализовать идею. А так - лучше бы в одном письме указать, что если все норм - то норм. Если в одном файле косяк с датой, то просто указать что косяк в том-то или том-то названии.

KaKTuZ49
07-09-2011, 17:06
Спасибо!)))
С вашей помощью доработал для Шести файлов.
Вроде работает!)))


Dim fName_1
Dim fName_2
Dim fName_3
Dim fName_4
Dim fName_5
Dim fName_6
Dim objFSO
Dim txtFile
Dim strMsg
Dim strMsg_1
Dim strMsg_2
Dim strMsg_3
Dim strMsg_4
Dim strMsg_5
Dim strMsg_6
Dim STR
Dim STR1
Dim STR2
Dim STR3
Dim STR4
Dim STR5
Dim STR6
Dim objCDO
Dim Conf

fName_1 = "c:\scriptcheckcrl\GEgarant.txt"
fName_2 = "c:\scriptcheckcrl\GEgarant2.txt"
fName_3 = "c:\scriptcheckcrl\CA1garant.txt"
fName_4 = "c:\scriptcheckcrl\CA1garant2.txt"
fName_5 = "c:\scriptcheckcrl\CA2garant.txt"
fName_6 = "c:\scriptcheckcrl\CA2garant2.txt"

Set objFSO= WScript.CreateObject("Scripting.FileSystemObject")

'_____________!!!!!!!!ФУНКЦИЯ НАХОЖДЕНИЯ СТРОКИ С ДАТОЙ

Function ReadLineTXT(FileName)
Set txtFile = objFSO.OpenTextFile(FileName)
Do While Not txtFile.AtEndOfStream
If InStr(txtFile.ReadLine, "Следующая публикация CRL") Then
ReadLineTXT = txtFile.ReadLine
Exit Do
End If
Loop
txtFile.Close

End Function

STR1=ReadLineTXT(fName_1)
STR2=ReadLineTXT(fName_2)
STR3=ReadLineTXT(fName_3)
STR4=ReadLineTXT(fName_4)
STR5=ReadLineTXT(fName_5)
STR6=ReadLineTXT(fName_6)

'_____________!!!!!!!!ФУНКЦИЯ СРАВНЕНИЯ ДАТЫ В ФАЙЛЕ С ТЕКУЩЕЙ

Function SMS(STR)
If DateDiff("n", CDate(Replace(STR, "г.", "")), Now) > 9 Then
SMS = "Просрочена"
Else
SMS = "Не просрочена"
End If
End function

strMsg_1=SMS(STR1)
strMsg_2=SMS(STR2)
strMsg_3=SMS(STR3)
strMsg_4=SMS(STR4)
strMsg_5=SMS(STR5)
strMsg_6=SMS(STR6)

'_____________!!!!!!!!СРАВНЕНИЕ СТАТУСОВ КАЖДОГО ФАЙЛА

If (strMsg_1 = "Не просрочена") and (strMsg_2 = "Не просрочена") and (strMsg_3 = "Не просрочена") and (strMsg_4 = "Не просрочена") and (strMsg_5 = "Не просрочена") and (strMsg_6 = "Не просрочена") then
strMsg = "Не просрочена"
Else
strMsg = "Просрочена"
End If


'_____________!!!!!!!!СООБЩЕНИЕ НА ПОЧТОВЫЙ ЯЩИК


Set objCDO = WScript.CreateObject("CDO.Message")

objCDO.From = "Ot kogo"
objCDO.To = "Komu"
objCDO.Subject = "Проверка CRL"
objCDO.HTMLBody = strMsg

Set Conf = objCDO.Configuration
Conf("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Conf("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp server"
' Conf("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
Conf("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0
' Conf("http://schemas.microsoft.com/cdo/configuration/sendusername") = "Login"
' Conf("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "Pass"
Conf("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Conf.Fields.Update

objCDO.Send

Set objFSO = Nothing
Set objCDO = Nothing

WScript.Quit


У вас не никаких версий по уменьшению строк?

SendMessage
07-09-2011, 18:03
У вас не никаких версий по уменьшению строк? »
Можно так: Option Explicit

Dim fName(5)
Dim objFSO
Dim i
Dim txtFile
Dim ReadLineTXT
Dim checkLic
Dim strMsg
Dim objCDO
Dim Conf

fName(0) = "c:\scriptcheckcrl\GEgarant.txt"
fName(1) = "c:\scriptcheckcrl\GEgarant2.txt"
fName(2) = "c:\scriptcheckcrl\CA1garant.txt"
fName(3) = "c:\scriptcheckcrl\CA1garant2.txt"
fName(4) = "c:\scriptcheckcrl\CA2garant.txt"
fName(5) = "c:\scriptcheckcrl\CA2garant2.txt"

Set objFSO= WScript.CreateObject("Scripting.FileSystemObject")

'_____________!!!!!!!!НАХОЖДЕНИЕ СТРОКИ С ДАТОЙ

For i = 0 To UBound(fName)
Set txtFile = objFSO.OpenTextFile(fName(i))
Do While Not txtFile.AtEndOfStream
If InStr(txtFile.ReadLine, "Следующая публикация CRL") Then
ReadLineTXT = txtFile.ReadLine
checkLic = checkLic + SMS(ReadLineTXT)
Exit Do
End If
Loop
txtFile.Close
Next

'_____________!!!!!!!!ФУНКЦИЯ СРАВНЕНИЯ ДАТЫ В ФАЙЛЕ С ТЕКУЩЕЙ

Function SMS(STR)
If DateDiff("n", CDate(Replace(STR, "г.", "")), Now) > 9 Then
SMS = 0
Else
SMS = 1
End If
End Function


'_____________!!!!!!!!СРАВНЕНИЕ СТАТУСОВ КАЖДОГО ФАЙЛА

If checkLic = 6 Then
strMsg = "Не просрочена"
Else
strMsg = "Просрочена"
End If

'_____________!!!!!!!!СООБЩЕНИЕ НА ПОЧТОВЫЙ ЯЩИК


Set objCDO = WScript.CreateObject("CDO.Message")

objCDO.From = "Ot kogo"
objCDO.To = "Komu"
objCDO.Subject = "Проверка CRL"
objCDO.HTMLBody = strMsg

Set Conf = objCDO.Configuration
Conf("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Conf("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp server"
' Conf("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
Conf("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0
' Conf("http://schemas.microsoft.com/cdo/configuration/sendusername") = "Login"
' Conf("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "Pass"
Conf("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Conf.Fields.Update

objCDO.Send

Set objFSO = Nothing
Set objCDO = Nothing

WScript.Quit

KaKTuZ49
09-09-2011, 14:39
УРА!!! СПАСИБО ОГРОМНОЕ!
С вашей помощью получилось сделать вот такой код:


SAVEFILE "http://*****1/garant.crl", "GE", "certutil -split c:\scriptcheckcrl\GEgarant.crl", objExec1, "GEgarant.txt"
SAVEFILE "http://*****1/garant2.crl", "GE", "certutil -split c:\scriptcheckcrl\GEgarant2.crl", objExec2, "GEgarant2.txt"
SAVEFILE "http://*****2/garant.crl", "CA1", "certutil -split c:\scriptcheckcrl\CA1garant.crl", objExec3, "CA1garant.txt"
SAVEFILE "http://*****2/garant2.crl", "CA1", "certutil -split c:\scriptcheckcrl\CA1garant2.crl", objExec4, "CA1garant2.txt"
SAVEFILE "http://*****3/garant.crl", "CA2", "certutil -split c:\scriptcheckcrl\CA2garant.crl", objExec5, "CA2garant.txt"
SAVEFILE "http://*****3/garant2.crl", "CA2", "certutil -split c:\scriptcheckcrl\CA2garant2.crl", objExec6, "CA2garant2.txt"


'__________Процедура на скачивание и на преобразование CRL в TXT


Sub SAVEFILE(URL1, Base_Name, Command, OBJ1, TXT)
strFileURL = URL1
URL = Split(StrReverse(strFileURL), "/")
basename = Base_Name & StrReverse(URL(0))

strHDLocation = "C:\scriptcheckcrl\" & basename
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
objXMLHTTP.open "GET", strFileURL, false
objXMLHTTP.send()


If objXMLHTTP.Status = 200 Then
Set objADOStream = CreateObject("ADODB.Stream")
objADOStream.Open
objADOStream.Type = 1 'adTypeBinary
objADOStream.Write objXMLHTTP.ResponseBody
objADOStream.Position = 0 'Set the stream position to the start
Set objFSO = Createobject("Scripting.FileSystemObject")
If objFSO.Fileexists(strHDLocation) Then objFSO.DeleteFile strHDLocation
Set objFSO = Nothing
objADOStream.SaveToFile strHDLocation
objADOStream.Close
Set objADOStream = Nothing
End if

Set objXMLHTTP = Nothing
Set objShell = CreateObject("WScript.Shell")
strCommand1 = Command

Set OBJ1 = objShell.Exec(strCommand1)
While objExec1.Status = 0
WScript.Sleep 20
Wend
strOutput = Replace(OBJ1.StdOut.ReadAll, VbCrLf & "CertUtil: -split command completed successfully.", "")

With WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(TXT, True)
.Write strOutput
.Close
End With

End Sub


'____________________________________________________________________________
Dim fName(5)
Dim objFSO
Dim i
Dim txtFile
Dim ReadLineTXT
Dim checkLic
Dim strMsg
Dim objCDO
Dim Conf
Dim DataCrl(5)

fName(0) = "c:\scriptcheckcrl\GEgarant.txt"
fName(1) = "c:\scriptcheckcrl\GEgarant2.txt"
fName(2) = "c:\scriptcheckcrl\CA1garant.txt"
fName(3) = "c:\scriptcheckcrl\CA1garant2.txt"
fName(4) = "c:\scriptcheckcrl\CA2garant.txt"
fName(5) = "c:\scriptcheckcrl\CA2garant2.txt"


Set objFSO= WScript.CreateObject("Scripting.FileSystemObject")

'_____________!!!!!!!!НАХОЖДЕНИЕ СТРОКИ С ДАТОЙ
For i = 0 To UBound(fName)
Set txtFile = objFSO.OpenTextFile(fName(i))
Do While Not txtFile.AtEndOfStream
If InStr(txtFile.ReadLine, "Следующая публикация CRL") Then
ReadLineTXT = txtFile.ReadLine
checkLic = checkLic + SMS(ReadLineTXT)
DataCrl(i) = ReadLineTXT
Exit Do
End If
Loop
txtFile.Close
Next

'_____________!!!!!!!!ФУНКЦИЯ СРАВНЕНИЯ ДАТЫ В ФАЙЛЕ С ТЕКУЩЕЙ

Function SMS(STR)
If DateDiff("n", CDate(Replace(STR, "г.", "")), Now) > 9 Then
SMS = 0
Else
SMS = 1
End If
End Function

'_____________!!!!!!!!СРАВНЕНИЕ СТАТУСОВ КАЖДОГО ФАЙЛА

If checkLic = 6 Then
strMsg = "Не просрочена"
Else
strMsg = "Просрочена"
End If

'_____________!!!!!!!!СООБЩЕНИЕ НА ПОЧТОВЫЙ ЯЩИК

Set objCDO = WScript.CreateObject("CDO.Message")
objCDO.From = "ОТ КОГО"
objCDO.To = "КОМУ"
objCDO.Subject = "Проверка CRL"

objCDO.HTMLBody = strMsg & "<br>" & "<br>" & "GEgarant.txt" & DataCrl(0) & "<br>" & "GEgarant2.txt" & DataCrl(1) & "<br>" & "CA1garant.txt" & DataCrl(2) & "<br>" & "CA1garant2.txt" & DataCrl(3) & "<br>" & "CA2garant.txt" & DataCrl(4) & "<br>" & "CA2garant2.txt" & DataCrl(5)

Set Conf = objCDO.Configuration
Conf("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Conf("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp сервер"
' Conf("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
Conf("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0
' Conf("http://schemas.microsoft.com/cdo/configuration/sendusername") = "Login"
' Conf("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "Pass"
Conf("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Conf.Fields.Update

objCDO.Send

Set objFSO = Nothing
Set objCDO = Nothing

WScript.Quit



!!! Объясните только, почему создается в папке ещё Blob0_0.crl ????

sov44
29-05-2012, 13:21
Есть текстовый файл типа
мороз
и
солнце
день
чудесный
Необходимо проверить наличие слова "день" и вывести сообщение, есть это слово в файле или нет. Попробовал так, но запутался в %Errorlevel%
@echo off
SetLocal enabledelayedexpansion
for /f "usebackq delims=" %%a in (`type "1.txt" ^|find "день"`) do set s=%%a
If %Errorlevel% GEQ 0 (echo слово день найдено) else (echo слово день не найдено)
Echo %s%
pause

Anonymоus
29-05-2012, 13:41
sov44, а для чего вы цикл используете?
Set Word=день
Type file.txt|Find "%Word%">nul&&(
Echo Found %Word% in file.txt
)||(
Echo Nothing found
)

sov44
29-05-2012, 13:50
v44, а для чего вы цикл используете? »
Anonymоus, действительно, цикл лишний, нужно было просто найти слово :) Спасибо за подсказку!




© OSzone.net 2001-2012