如何在VBScript中从当前行4行

时间:2012-03-21 20:32:47

标签: vbscript

我有一个我想要阅读的文本文件。看起来像这样

错误:死锁

Param 0 = xyx

Param 1 = 22332244

Param 2 =

Param 3 = 1

Param 4 =

我需要搜索String“Deadlock”并为Param 0和Param 1吐出输出。现在我只能读取包含文本死锁的行:(

Const ForReading = 1

Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Pattern = "deadlock"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\1\Retrieve.log", ForReading)

Do Until objFile.AtEndOfStream
    strSearchString = objFile.ReadLine
    Set colMatches = objRegEx.Execute(strSearchString)  
    If colMatches.Count > 0 Then
        For Each strMatch in colMatches   
            Wscript.Echo strSearchString 
        Next
    End If
Loop

objFile.Close

Const ForReading = 1 Set objRegEx = CreateObject("VBScript.RegExp") objRegEx.Pattern = "deadlock" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\1\Retrieve.log", ForReading) Do Until objFile.AtEndOfStream strSearchString = objFile.ReadLine Set colMatches = objRegEx.Execute(strSearchString) If colMatches.Count > 0 Then For Each strMatch in colMatches Wscript.Echo strSearchString Next End If Loop objFile.Close

1 个答案:

答案 0 :(得分:0)

Marc B在简单代码中的想法:

Option Explicit

Function qq(sTxt) : qq = """" & sTxt & """" : End Function

Const csFind  = "Error: Deadlock"
Dim nLines : nLines   = 3
Dim bFound : bFound   = False
Dim tsIn   : Set tsIn = CreateObject("Scripting.FileSystemObject").OpenTextFile("..\data\Text-1.txt")
Do Until tsIn.AtEndOfStream
   Dim sLine : sLine = tsIn.ReadLine()
   If bFound Then
      WScript.Echo sLine, "=>", qq(Trim(Split(sLine, "=")(1)))
      nLines = nLines - 1
      If 0 = nLines Then Exit Do
   Else
      bFound = sLine = csFind
   End If
Loop
tsIn.Close

输出:

type ..\data\Text-1.txt
Error: Deadlock
Param 0 = xyx
Param 1 = 22332244
Param 2 =
Param 3 = 1
Param 4 =
Error: This is no Deadlock
Param 0 = abc
Param 1 = def
Param 2 =
Param 3 = ghi
Param 4 =

DNV35 E:\trials\SoTrials\answers\9812373\vbs
cscript 00.vbs
Param 0 = xyx => "xyx"
Param 1 = 22332244 => "22332244"
Param 2 = => ""

“简单”意味着“正是解决问题所需要的 - 不多也不少”。

  1. 一个体面的脚本需要“Option Explicit”来防止打字错误 变量名称。
  2. 如果不使用.OpenTextFile方法的create和format参数,则不需要iomode参数ForReading(这是默认值)。
  3. 如果搜索常量/固定字符串,RegExps只是一个容易出错的开销。
  4. 如果你想使用“死锁”模式匹配“死锁”,你需要.IgnoreCase(证明3)
  5. 如果你不想匹配“错误:这不是死锁”,你需要一个更复杂的模式(再次证明3)
  6. 如果只使用一次对象,则不需要objFSO变量;同样适用于strSearchString(为什么强调'字符串'两次,但是要搜索'搜索'与'搜索'差异?)
  7. 在你的情况下,.Count是0或1 - 我假设没有像“错误:死锁1,死锁2和另一个死锁”这样的行;要处理多个匹配,你必须指定.Global。
  8. 循环使用匹配项对你的问题毫无意义 - 你是否有触发“死锁”的行。
  9. 搜索触发线然后执行某项操作的脚本至少需要一个状态(在这种情况下为bFound和nLines),以根据之前看到的线条的属性执行不同的操作,现在很久就会忘记它们。
  10. 在“某事物”之后,无需进一步处理该文件。