1

Тема: VBScript: чтение последних N строк текстового файла

Основная идея состоит в создании массива из N элементов для хранения последовательно считываемых строк текстового файла и организации на основе этого массива кольца со скользящим началом очереди. Данный скрипт отличает бережное отношение к оперативной памяти, в отличие от простого «.ReadAll()».

Option Explicit

Dim strPath
Dim lngLines

Dim objFSO
Dim objTS

Dim i
Dim j


strPath  = "c:\Temp\Some.txt" ' Путь к текстовому файлу
lngLines = 10                 ' Количество потребных последних строк

ReDim arrLines(lngLines - 1)  ' Массив для организации очереди из считываемых строк

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objTS  = objFSO.OpenTextFile(strPath)

With objTS
    i = 0
    
    Do Until .AtEndOfStream
        arrLines(i) = .ReadLine()
        
        i = (i + 1) Mod lngLines
    Loop
    
    .Close
End With

Set objTS  = Nothing
Set objFSO = Nothing

For j = 0 To lngLines - 1
    WScript.Echo arrLines((i + j) Mod lngLines)
Next

WScript.Quit 0

Автор идеи — shiz.

2

Re: VBScript: чтение последних N строк текстового файла

Другим вариантом может стать использование Log Parser 2.2 (VBScript: работаем с утилитой LogParser от Microsoft):

Option Explicit

Dim strPath
Dim lngLines

Dim objLogQuery
Dim objCOMTextLineInputContext

Dim strQuery
Dim strText


strPath  = "c:\Temp\Some.txt" ' Путь к текстовому файлу
lngLines = 10                 ' Количество потребных последних строк

Set objLogQuery                = WScript.CreateObject("MSUtil.LogQuery")
Set objCOMTextLineInputContext = WScript.CreateObject("MSUtil.LogQuery.TextLineInputFormat")

With objCOMTextLineInputContext
    .codepage       = 1251
    .recurse        = False
    .splitLongLines = False
End With

strQuery = "SELECT TOP " & CStr(lngLines) & " Text, Index FROM '" & strPath & "' ORDER BY Index DESC"
strText  = ""

With objLogQuery.Execute(strQuery, objCOMTextLineInputContext)
    Do Until .atEnd
        With .getRecord
            strText = .getValue("Text") & vbCrLf & strText
        End With
        
        .moveNext
    Loop
    
    .close
End With

Set objCOMTextLineInputContext = Nothing
Set objLogQuery                = Nothing

WScript.Echo strText

WScript.Quit 0