【问题标题】:How to obtain last three lines content of a log file using VBScript function如何使用 VBScript 函数获取日志文件的最后三行内容
【发布时间】:2014-06-04 11:04:06
【问题描述】:

谁能建议我一个 VBscript 函数来获取文本文档的最后 3 行(例如:log.txt?下面是我的代码,它可以获取和在我的屏幕上显示整个日志,但我想只获取名为 log.txt 的日志文件的最后 3 行

<script type="text/Vbscript">
Option Explicit
Dim File
File = "C:\\test.txt"
'***********************************************************
Sub LoadMyFile()
    myDiv.innerHTML = LoadFile(File)
End Sub
'***********************************************************
Function LoadFile(File)
    On Error Resume Next
    Dim fso,F,ReadMe,Tab,i,paragraphe
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set F = fso.OpenTextFile(File,1)
    LoadFile = Err.Number
    If Err.Number <> 0  Then
        MsgBox Err.Description,16," Error"
        Exit Function
    End If
    ReadMe = F.ReadAll
    Tab = split(ReadMe,vbcrlf)
    For i = lbound(Tab) to ubound(Tab)
        paragraphe=paragraphe & Tab(i) & "<br>"
    Next
    LoadFile = paragraphe
End Function
</script>

代码不工作@Steve

    <html>
    <script type="text/Vbscript">
    Option Explicit
    Dim File
    File = "C:\\test.txt"
    '***********************************************************
    Sub LoadMyFile()
        myDiv.innerHTML = LoadFile(File)
    End Sub
    ************************************************************
    Function CheckProcesses()
    dim startLine
On Error Resume Next
    Dim fso,F,ReadMe,Tab,i,paragraphe
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set F = fso.OpenTextFile(File,1)
    LoadFile = Err.Number
    If Err.Number <> 0  Then
        MsgBox Err.Description,16," Error"
        Exit Function
    End If
    ReadMe = F.ReadAll
    Tab = split(ReadMe,vbcrlf)
    For i = lbound(Tab) to ubound(Tab)
        paragraphe=paragraphe & Tab(i) & "<br>"
    Next
    if ubound(Tab) > 2 Then
       startLine = ubound(Tab) - 2
    else
       startLine = 0
    end if
    For i = startLine to ubound(Tab)
        paragraphe=paragraphe & Tab(i) & "<br>"
    Next
    LoadFile = paragraphe
    End Function
    </script>
     <input type="button" name="Log" id="Start" value="Log Dctm" onclick="CheckProcesses()"></html>

感谢和问候 德布

【问题讨论】:

  • 如果您对其他答案发表评论,我无法帮助您。但是,如果您查看上面添加的代码,您会注意到您没有删除之前构建paragraphe 字符串的循环。这意味着您的 paragraphe 字符串由所有前面的行加上最后三行组成。您应该删除循环遍历整个选项卡数组的代码,只保留我的更改......

标签: html vb.net vbscript hta


【解决方案1】:

避免大文件内存耗尽的另一种解决方案:

filename = "C:\path\to\your.txt"
numlines = 3

Set fso = CreateObject("Scripting.FileSystemObject")

'create and initialize ring buffer
ReDim buf(numlines-1)
For n = 0 To UBound(buf)
  buf(n) = Null
Next
i = 0

'read lines into ring buffer
Set f = fso.OpenTextFile(filename)
Do Until f.AtEndOfStream
  buf(i) = f.ReadLine
  i = (i+1) Mod numlines
Loop
f.Close

'output ringbuffer content (skip null values)
For n = 1 To numlines
  If Not IsNull(buf(i)) Then WScript.Echo buf(i)
  i = (i+1) Mod numlines
Next

数组buf 结合索引变量i 和模运算用作包含从文件中读取的最后几行的ring buffer(最多numlines)。

在第二个循环结束时(读取输入文件的那个),索引i 指向数组字段之后包含从文件中读取的最后一行,即缓冲区的开头。

如果从文件中读取的行数少于numlines,则来自数组初始化的Null 值让输出例程“滑动”到第一个内容行(或缓冲区的末尾)。输出循环中的变量n 只是一个计数器,以便从索引i 开始读取环形缓冲区中的numlines 元素,并以索引i-1 结束(模换行)。

【讨论】:

  • 不应该For n = 1 To numlinesFor n = i To numlines(我不是1)吗?
  • @Ekkehard.Horner No. i 可以是环形缓冲区中的任何位置,具体取决于输入文件中的行数,因此我需要将缓冲区从i 输出到@ 987654338@(模包装)。 n 只是一个计数器,以确保处理缓冲区中的 numlines 字段。我本可以使用像 n = i : Do ... Loop Until i = n 这样的循环,但我认为 For 循环会更容易理解。
  • 是的,我现在看到了(你的解释之后)。
  • @Ekkehard.Horner 我在回答中添加了更多解释。
  • @Dojo_user 请务必阅读 Meta Stack Exchange 上的 this post(及其答案)。
【解决方案2】:

给定一个行数组 (Tab),要显示的最后 n 行从 UBound(Tab) - n + 1 开始,以 UBound(Tab) 结束。您应该测试“Tab 中少于 n 行”和“Tab 的最后一行是否为空(尾随 EOL)”。

【讨论】:

  • @Steve 我试图在我的代码中进行更改,但它不起作用。如上所述,我已将更改的代码(更改的代码)粘贴到我的原始线程中,请问我做错了什么。
【解决方案3】:

我无法对此进行测试,但如果您知道变量TabUBound,那么最后三行是UBound(tab)-2UBound(tab)-1UBound(tab)

For i = ubound(Tab) - 2 to ubound(Tab)
    paragraphe=paragraphe & Tab(i) & "<br>"
Next

当然,这要求您的日志文件中至少有 3 行,因此,在进入循环之前可能应该进行一些检查

dim startLine
if ubound(Tab) > 2 Then
   startLine = ubound(Tab) - 2
else
   startLine = 0
end if
For i = startLine to ubound(Tab)
    paragraphe=paragraphe & Tab(i) & "<br>"
Next

【讨论】:

  • 请将UBound(tab-x)改为UBound(tab)-x
【解决方案4】:

另一种解决方案

你可以使用这个功能:

Function ExtractLinesFromTextFile(ByRef TextFile, ByRef FromLine, ByRef ToLine)

Option Explicit
Dim Title,FromLine,ToLine,fso,Readfile,strBuff,InputFile,TotalNbLines
Title = "Extract Lines From TextFile © Hackoo 2014"
InputFile = "c:\test.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set Readfile = Fso.OpenTextFile(InputFile,1)
strBuff = Readfile.ReadAll
TotalNbLines = Readfile.Line
Readfile.Close
MsgBox "The total number of lines in this file """& InputFile &""" = "& TotalNbLines,VbInformation,Title
'To extract the 3 last lines
MsgBox ExtractLinesFromTextFile(InputFile,TotalNbLines - 2,TotalNbLines),64,Title
'*********************************************************************************************************
Public Function ExtractLinesFromTextFile(ByRef TextFile, ByRef FromLine, ByRef ToLine) '<-- Inclusive
    Const TristateUseDefault = -2 'To Open the file using the system default.
    On Error Resume Next
    If FromLine <= ToLine Then
        With CreateObject("Scripting.FileSystemObject").OpenTextFile(TextFile,1,true,TristateUseDefault)
            If Err.number <> 0 Then
                MsgBox err.description,16,err.description
                Exit Function
            Else
                Do Until .Line = FromLine Or .AtEndOfStream
                    .SkipLine
                Loop
                Do Until .Line > ToLine Or .AtEndOfStream
                    ExtractLinesFromTextFile = ExtractLinesFromTextFile & (.ReadLine & vbNewLine)
                Loop
            End If
        End With
    Else
        MsgBox "Error to Read Line in TextFile", vbCritical,"Error to Read Line in TextFile"
    End If
End Function
'*********************************************************************************************************

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2014-07-08
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多