2

スクリプト エキスパートの皆様、こんにちは。

リモートサーバーにログファイルがあります..リモートサーバーにc:\vb\text.log

リモートシステムを次のlist.Txtように含めました

server1
server2

以下はログのサンプルです。

application working
[10/23/2012 working

[10/24/2012 nos appdown
error found you need to check this

以下は私のスクリプトです。

Set Fso = CreateObject("Scripting.FileSystemObject")
Set InFile = fso.OpenTextFile("list.Txt")
Set out = fso.CreateTextFile("error.log")

Const ForReading = 1
Do While Not (InFile.atEndOfStream)
  strComputer = InFile.ReadLine
  today = Date()
  Set fso = CreateObject("Scripting.FileSystemObject")
  strFilePath = "\\" & strComputer & "\c$\vb\"

  Set InputFile = fso.OpenTextFile(strFilePath & "text.log", 1)
  Do While Not (InputFile.AtEndOfStream)
    strLine = InputFile.ReadLine

    If Left(line, Len(today)+1) = "[" & today Then
      ' line timestamped with today's date
      If InStr(line, "nos") > 0 Then
        ' line contains "error"
        out.WriteLine InStr & vbTab & strComputer
      End If
    End If
  Loop
  InputFile.close
Loop

out.Close
InFile.Close

基本的に、上記のスクリプトはtext.log[10/24/2012 nos appdown. 次に、現在の日付行に「Nos」として見つかった場合..次に、error.logコンピューター名でに書き込む必要があります。

私の場合、出力は来ていませんが、文字列「Nos」を検索しているようです。

この状況から私を解放してください....

4

2 に答える 2

3

バグは、明示的なオプションを指定しないことです。そのようです、

option explicit

これにより、VBScript は宣言されていない変数について不平を言うようになります。これにより、スペルミスのある変数名を簡単に見つけることができます。そのように、dimステートメントを使用したDelcare変数

dim Fso, out

スクリプトを再度実行し、比較で存在しない初期化されていない変数を使用していることを確認します。

strLine = InputFile.ReadLine ' Read stuff to strLine
If Left(line, Len(today)+1) = "[" & today Then ' ERROR. line has no value!
于 2012-10-24T06:50:01.060 に答える
0

私のスクリプトの適応にはいくつかの問題があります。

  • vonPryzによってすでに指摘されているように、これが問題の原因です。

    strLine = InputFile.ReadLine
    If Left(line, Len(today)+1) = "[" & today Then

    変数名を からfileに変更する場合、その変数が割り当てられている行だけでなく、その変数のすべての出現箇所strFileを変更する必要があります。

  • out.WriteLine InStr & vbTab & strComputer

    InStrは関数であり、正しい数の引数で呼び出していないため、この行も失敗します。

  • today = Date()

    スクリプトの実行中に日付が変更されることが予想され、すべてのループ サイクルで現在の日付が必要な場合を除き、これはループ内にあるべきではありません。

  • Set fso = CreateObject("Scripting.FileSystemObject")

    fsoスクリプトの先頭でインスタンス化されます。特に各ループサイクルでは、再インスタンス化する必要はありません。それは単なる資源の浪費です。

  • Const ForReading = 1

    一度も使用していない定数を定義しても意味がありません。

  • Do While Not ...

    を使用Do Until ...すると、読みやすく、理解しやすくなります。

于 2012-10-24T11:34:33.100 に答える