1

Тема: VBS: работа с .Log файлом

Здравствуйте!

Подскажите пожалуйста, как выводить в Msgbox последние 14 строк конкретного Лог-файла? Файл имеет плавающий размер...
Этот лог лежит в опредёлённой папке по одному и тому-же пути. Там он один.

Но у разных пользователей он носит разные имена.

Существует решение на VBScript ?

2

Re: VBS: работа с .Log файлом

Задача, как я понимаю, складывается из двух частей:

1. Определить имя единственного файла в заданной папке.
2. Если файл единственный — прочитать последние N строк.

Пункт первый решается обычными методами. Для второго предлагаю использовать LogParser (хоть у него и нет предиката LAST, но всё ж будет быстрее прочего).

3 (изменено: shiz, 2012-05-12 02:08:33)

Re: VBS: работа с .Log файлом

Попытка решения на VBScript:

Option Explicit
Const N = 14           'Необходимое количество последних строк
Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim Path
Path = CreateObject("Shell.Application")._
    NameSpace("shell:Common Documents\NAME\logs").Self.Path
Dim File, TextStream
For Each File In FSO.GetFolder(Path).Files
  If UCase(FSO.GetExtensionName(File.Name)) = "LOG" Then
    Set TextStream = File.OpenAsTextStream(1)
    Exit For
  End If
Next
If IsEmpty(TextStream) Then
  MsgBox "Файл *.LOG не найден!"
  WScript.Quit 1
End If

ReDim Lines(N - 1)
Dim I: I = 0
While Not TextStream.AtEndOfStream
  Lines(I) = TextStream.ReadLine()
  I = (I + 1) Mod N
Wend

Dim Message: Message = ""
Dim J
For J = 0 To N - 1
  Message = Message & Lines((I + J) Mod N) & vbNewLine
Next
MsgBox Message
Забыл пароль и потерял e-mail.

4

Re: VBS: работа с .Log файлом

shiz, интересное решение. Сами придумали?

5

Re: VBS: работа с .Log файлом

alexii
Спасибо, придумал сам, по-моему ничего такого в нём нет.

Забыл пароль и потерял e-mail.

6

Re: VBS: работа с .Log файлом

Ну, почему же, а количество используемой памяти?

2All: у нас было что-либо подобное ранее?

7

Re: VBS: работа с .Log файлом

Пример, работающий при условии несовпадения строк:

'==================================================================
' Показать последние N строк в log-файле
' Параметры: "<Путь к папке c log-файлом>" N
'==================================================================
With WScript.Arguments : Path = .Item(0) : N = .Item(1) : End With
L = vbnewline
With CreateObject("Scripting.FileSystemObject")
  For Each F In .GetFolder(Path).Files
    If  StrComp(.GetExtensionName(F), "log", 1) = 0 Then
      Set File = .OpenTextFile(Path & .GetFilename(F), 1)
      Exit For
    End if
  Next
End With
Text = File.ReadAll
If InstrRev(Text, L) > 0 Then _
MsgBox Mid(Text, InStrRev(Text, Split(Text, L)(Abs(File.Line) - N) & L))
File.Close

8

Re: VBS: работа с .Log файлом

shiz пишет:

alexii
Спасибо, придумал сам, по-моему ничего такого в нём нет.

Очень лаконичное решение прохода по массиву!

Я когда аналогичное решение делал, то получилось очень громоздко - держал дополнительные признаки для обслуживания такого массива, а так как содержимое массива получается из двух "хронологических последовательностей", то и вывод содержимого массива делал за два раза.

Вот, пример моей функции, которая формирует из последних строк опции выбора для HTA-приложения.

' --- формирование списка протокола - gsFileLogPing'
	i_aLOG_max = gi_tSetPC_LogLimitMax - 1
	ReDim a_LOG( i_aLOG_max )
	If fso.FileExists( gsFileLogPing ) Then
		Dim fspi, sLine, i, iCnt, i_aLOG_cyrcle, i_aLOG_last, i_aLOG_prev
		Set fspi=fso.OpenTextFile(gsFileLogPing, 1)
		iCnt = 0          'общее кол-во считанных с файла строк'
		i_aLOG_cyrcle = 0 'признак кругового заполнения массива ga_LOG'
		i_aLOG_last = -1  'индекс последнего задействованного элемента ga_LOG'
		i_aLOG_prev = -1  'индекс предпоследнего залействованного элемента ga_LOG'
		Do While not fspi.AtEndOfStream
			sLine = Trim( fspi.ReadLine )
			iCnt = iCnt + 1
			If iCnt>1 Then i_aLOG_prev = i_aLOG_last
			If i_aLOG_last + 1 <= i_aLOG_max Then
				i_aLOG_last = i_aLOG_last + 1
			else 'закручиваем массив по кругу'
				i_aLOG_cyrcle = 1
				i_aLOG_last = 0
			End If
			a_LOG (i_aLOG_last) = sLine
		Loop
		fspi.Close
		Set fspi = Nothing
		If iCnt > 0 Then
			'формирование таблицы протокола'
			sLog = "<SELECT >"
			sOpt = ""
			For i=i_aLOG_last To 0 Step -1
				sLine = Trim( a_LOG (i) )
				'Формируем из sLine новую позицию'
				sOpt = sOpt & "<OPTION>" & sLine & "</OPTION>"
			NEXT
			If i_aLOG_cyrcle Then
				For i=i_aLOG_max-1 To i_aLOG_last+1 Step -1
					sLine = a_LOG (i)
					'Формируем из sLine новую позицию'
					sOpt = sOpt & "<OPTION>" & sLine & "</OPTION>"
				NEXT
			End If
			sLog = sLog & sOpt & "</SELECT>"
		End If 'iCnt > 0'
	End IF 'fso.FileExists( gsFileLogPing )

А Ваша идея красивая! Браво. Мне понравилось.

WBR. Roman

9 (изменено: _D_V_S_, 2012-05-07 23:14:20)

Re: VBS: работа с .Log файлом

alexii пишет:

Задача, как я понимаю, складывается из двух частей:

1. Определить имя единственного файла в заданной папке.
2. Если файл единственный — прочитать последние N строк.

Пункт первый решается обычными методами. Для второго предлагаю использовать LogParser (хоть у него и нет предиката LAST, но всё ж будет быстрее прочего).

shiz пишет:

Попытка решения на VBScript:

Большое спасибо!!

А если в папке единственный .log , но есть файлы с другими расширениями?
Можно-ли как-то привязать работу скрипта к расширению?
Ну по типу к *.log - всё равно Log там один?

10

Re: VBS: работа с .Log файлом

_D_V_S_ пишет:

Можно-ли как-то привязать работу скрипта к расширению?

В моём скрипте именно так.

11

Re: VBS: работа с .Log файлом

Flasher пишет:

Пример, работающий при условии несовпадения строк:
[...]

Я не удержался, чтоб не потестировать) Класс!
Как оказывается поучительно бывает почитать форум

WBR. Roman

12

Re: VBS: работа с .Log файлом

Flasher пишет:
_D_V_S_ пишет:

Можно-ли как-то привязать работу скрипта к расширению?

В моём скрипте именно так.

Ваш скрипт с параметрами.
А мне надо "без". Чтобы человек запустил его и увидел MsgBox :-)

13

Re: VBS: работа с .Log файлом

_D_V_S_ пишет:

А если в папке единственный .log , но есть файлы с другими расширениями?

Используйте:

    If  StrComp(.GetExtensionName(F), "log", 1) = 0 Then

отсюда.

14

Re: VBS: работа с .Log файлом

_D_V_S_ пишет:
Flasher пишет:
_D_V_S_ пишет:

Можно-ли как-то привязать работу скрипта к расширению?

В моём скрипте именно так.

Ваш скрипт с параметрами.
А мне надо "без". Чтобы человек запустил его и увидел MsgBox :-)

Ну, Вы даете)
Вот как я тестировал сей скрипт (замена первой строки)


' With WScript.Arguments : Path = .Item(0) : N = .Item(1) : End With
Path = "c:\R\Develop\last_row_from_log\" : N = 5
WBR. Roman

15

Re: VBS: работа с .Log файлом

Rom5 пишет:
_D_V_S_ пишет:
Flasher пишет:

В моём скрипте именно так.

Ваш скрипт с параметрами.
А мне надо "без". Чтобы человек запустил его и увидел MsgBox :-)

Ну, Вы даете)
Вот как я тестировал сей скрипт (замена первой строки)


' With WScript.Arguments : Path = .Item(0) : N = .Item(1) : End With
Path = "c:\R\Develop\last_row_from_log\" : N = 5

Да Вы не допоняли...
Куча людей, у каждого свой лог.
Имена файлов - разные, но находятся они по одному пути.

По этому пути - единственный файл с раширением .log, но могут быть другие файлы с другими расширениями (грубо говоря - лишний мусор).

Эти люди должны просто запустить скрипт и увидеть MsgBox :-)

16

Re: VBS: работа с .Log файлом

alexii пишет:
_D_V_S_ пишет:

А если в папке единственный .log , но есть файлы с другими расширениями?

Используйте:

    If  StrComp(.GetExtensionName(F), "log", 1) = 0 Then

отсюда.

Огромное спасибо!!

17 (изменено: Flasher, 2012-05-08 00:15:37)

Re: VBS: работа с .Log файлом

Rom5 пишет:

Я не удержался, чтоб не потестировать) Класс!

Спасибо. Делал для разминки.)

_D_V_S_ пишет:

Ваш скрипт с параметрами.

Параметры как раз создаются для удобства. Комстрока не только в cmd бывает, но и в кнопках тулбаров, ярлыках, что позволяет при одном скрипте иметь несколько вариантов для разных файлов/папок и значений переменных.

18 (изменено: alexii, 2012-05-08 00:07:55)

Re: VBS: работа с .Log файлом

2_D_V_S_: Хммм...
Самый первый вариант кода Flasher и так Вас должен полностью удовлетворить.
Людям раздайте батник или ярлык со строкой запуска скрипта, который и будет запускать скрипт, с указанием того самого единственного пути.
Либо вбейте путь в скрипт, как я сделал: Path = "c:\R\Develop\last_row_from_log\" - это у меня тот самый единственный путь...

Не злоупотребляйте цитированием.

WBR. Roman

19

Re: VBS: работа с .Log файлом

А почему не работает в пути

Const PATH = "%CommonDocuments%\NAME\logs"

в то время когда

Const PATH = "c:\Users\Public\Documents\NAME\logs"

прекрасно работает?

20

Re: VBS: работа с .Log файлом

1. Вы уверены, что есть такая переменная окружения? Что говорит:

set CommonDocuments

в командной строке?

2. Если есть, то для использования в WSH её надо развернуть:

Const PATH = "%CommonDocuments%\NAME\logs"

Dim objWshShell

Set objWshShell = WScript.CreateObject("WScript.Shell")

WScript.Echo objWshShell.ExpandEnvironmentStrings(PATH)

А вообще: один вопрос — одна тема.

21

Re: VBS: работа с .Log файлом

Rom5 пишет:

Людям раздайте ... ярлык со строкой запуска скрипта

О чём я и говорю. Положить ярлык рядом со скриптом, в поле "Объект" вписать след. конструкцию:

'%WINDIR%\system32\RunDll32.exe shell32.dll,ShellExec_RunDLL .\ИМЯ_СКРИПТА.vbs c:\Users\Public\Documents\NAME\logs\ 14

22 (изменено: _D_V_S_, 2012-05-08 00:26:28)

Re: VBS: работа с .Log файлом

Пошукал, погуглил по буржуйским форумам и решил-таки! :-)

Option Explicit

 Const COMMONDOCUMENTS = &H2e 
 Dim objShell : Set objShell = CreateObject("Shell.Application") 
 Dim objFolder : Set objFolder = objShell.Namespace(COMMONDOCUMENTS) 
 Dim objFolderItem : Set objFolderItem = objFolder.Self 
 Wscript.Echo objFolderItem.Path

Dim P1 : P1 = objFolderItem.Path
Const P2 = "\NAME\logs"
Dim PATH : PATH = P1 + P2
 
Wscript.Echo PATH

И т.д...
Всё работает!  :-)

Всем огромное Спасибо за помощь!!

Завтра буду в божеский вид скрипт приводить...

23 (изменено: _D_V_S_, 2012-05-08 00:38:47)

Re: VBS: работа с .Log файлом

Переменная-то есть (Windows у меня) - но CMD отвечает:

C:\Users\DVS>set CommonDocuments
Переменная среды CommonDocuments не определена

Странно...

А Ваш скрипт выдаёт кстати:

%CommonDocuments%\NAME\logs

Но - моя наработка заработала как надо...

Спасибо ещё раз!!

24

Re: VBS: работа с .Log файлом

Переменная-то есть (Windows у меня)

Значит, нет такой переменной окружения, Вы её выдумали .

А Ваш скрипт выдаёт кстати:

Естественно: нет переменной — нечего и разворачивать.

Пошукал, погуглил по буржуйским форумам…

Наши тоже не лыком шиты : Серый форум / WSH: перечень предопределённых символьных имён Shell.Application. Ваше имя — «shell:Common Documents». Однако же это не переменная окружения.

25 (изменено: _D_V_S_, 2012-05-08 01:33:52)

Re: VBS: работа с .Log файлом

Одно непонятно - как-же всё-таки прописать, чтобы скрипт работал только с файлом по расширению .log ...
:-(

PS я брал отсюда:

PS Может, если по другому нельзя, перед выполнением основной части скрипта просто удалять лишние файлы из директории?
Не соображу, как использование регулярных выражений привязать к имени и расширению файла.

Я в ступоре :-(

26

Re: VBS: работа с .Log файлом

На всякий случай изменил #3 с учётом ".LOG" и "%CommonDocuments%".

Забыл пароль и потерял e-mail.

27

Re: VBS: работа с .Log файлом

shiz пишет:

На всякий случай изменил #3 с учётом ".LOG" и "%CommonDocuments%".

Огромное спасибо!!

28

Re: VBS: работа с .Log файлом

Извиняюсь, внёс ещё одно (косметическое) изменение в #3:

Path = CreateObject("Shell.Application")._
    NameSpace("shell:Common Documents\NAME\logs").Self.Path

вместо громоздкого и не вполне корректного:

Path = FSO.BuildPath(_
    CreateObject("Shell.Application")._
      NameSpace("shell:Common Documents").Self.Path, _
    "NAME\logs"_
  )
Забыл пароль и потерял e-mail.

29

Re: VBS: работа с .Log файлом

Добавил идею в Коллекцию: VBScript: чтение последних N строк текстового файла.