0

これが機能する場合、接続がある場合はインターネット接続を確認する必要があります。何もしません。接続がない場合は、txtfile にエラーを書き込む必要があります。5 回発生した場合、エラーが発生するはずですが、発生しません。

私が今持っているコード全体と、ループに入れたいコードの一部をお見せします。思うように取れない。ファイルに5回書き込んだ後、1​​つのイベントエラーを作成したい。

これはコード全体です。必要なコードをその下のループに入れます

strDirectory = "Z:\text2"
strFile = "\foutmelding.txt"
strText = "De connectie is verbroken" 
strWebsite = "www.helmichbeens.com"


If PingSite(strWebsite) Then WScript.Quit    'Website is pingable - no further action required
Set objFSO = CreateObject("Scripting.FileSystemObject")

RecordSingleEvent
Dim fout 
For fout = 1 To 5 : Do
    If fout = 5 Then Exit Do

        Set WshShell = WScript.CreateObject("WScript.Shell")
        Call WshShell.LogEvent(1, "Test Event")
Loop While False : next

'------------------------------------
'Record a single event in a text file
'------------------------------------
Sub RecordSingleEvent
    If Not objFSO.FolderExists(strDirectory) Then objFSO.CreateFolder(strDirectory)
    Set objTextFile = objFSO.OpenTextFile(strDirectory & strFile, 8, True)
    objTextFile.WriteLine(Now & strText)
    objTextFile.Close
End sub
'----------------
'Ping my web site
'----------------
Function PingSite( myWebsite )
    Set objHTTP = CreateObject( "WinHttp.WinHttpRequest.5.1" )
    objHTTP.Open "GET", "http://" & myWebsite & "/", False
    objHTTP.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MyApp 1.0; Windows NT 5.1)"
    On Error Resume Next
    objHTTP.Send
    PingSite = (objHTTP.Status = 200)
    On Error Goto 0
End Function
'-----------------------------------------------
'Counts the number of lines inside the text file
'-----------------------------------------------
Function EventCount(fout)
    strData = objFSO.OpenTextFile(strDirectory & strFile,ForReading).ReadAll
    arrLines = Split(strData,vbCrLf)
    EventCount = UBound(arrLines)
End Function

これはコード全体であり、スクリプトがテキストファイルに 5 回書き込みを行った後にイベント ログをすぐに作成するため、正しく動作しません。

テキストファイルに書き込むコードは次のとおりです

Sub RecordSingleEvent
    If Not objFSO.FolderExists(strDirectory) Then objFSO.CreateFolder(strDirectory)
    Set objTextFile = objFSO.OpenTextFile(strDirectory & strFile, 8, True)
    objTextFile.WriteLine(Now & strText)
    objTextFile.Close
End sub

ここにコードがありますが、この部分が機能しないか、少なくともこの部分だと思います

Dim fout 
For fout = 1 To 5 : Do
    If fout = 5 Then Exit Do

        Set WshShell = WScript.CreateObject("WScript.Shell")
        Call WshShell.LogEvent(1, "Test Event")
Loop While False : next

Function EventCount(fout)
    strData = objFSO.OpenTextFile(strDirectory & strFile,ForReading).ReadAll
    arrLines = Split(strData,vbCrLf)
    EventCount = UBound(arrLines)
End Function

これは機能していない部分であり、もうどうすればよいかわかりません。よろしければご覧ください。

ところで:このコードは、ネットワーク管理者にとって非常に便利です

4

1 に答える 1

0

で非常に奇妙なことをしますfor do while false next loop。早期エスケープは、for ループ自体でも実行できます。

Dim fout, WshShell
Set WshShell = WScript.CreateObject("WScript.Shell") ' Get this out of the loop, you only have to create it once.

For fout = 1 To 5
    if fout = 5 then exit for
    Call WshShell.LogEvent(1, "Test Event")
next

を使用することをお勧めしOption Explicitます。初期化されていない変数をたくさん使用しています。さらに、ForReadingこれは VBScript キーワードではないため、適切な値を割り当てる必要があります。グローバル定数にすることができます:

Const ForReading = 1

Option Explicit を使用していれば、そのことに気が付くはずです。

外部グローバル変数ではなく、パラメーターで機能する関数を作成してみてください。したがって、EventCount関数を次のようにリファクタリングします。

Function EventCount(logFilePath)
    dim strData, arrLines
    strData = objFSO.OpenTextFile(logFilePath, ForReading).ReadAll
    arrLines = Split(strData,vbCrLf)
    EventCount = UBound(arrLines) + 1
End Function

foutが EventCount 関数で使用されていないことに気付きましたか?

また、配列のインデックスが 0 であるため、EventCount を 1 増やします (空の配列の場合、ubound は -1 を返します)。カウントは、インデックスとは対照的に、アイテムの正確な量として常に定義されます。

編集:あなたのロジックを読んで、私はあなたがこれをしたいと思います:

Dim fout, objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Ping the website five times
For fout = 1 to 5
    If PingSite(strWebsite) Then Exit For    'Website is pingable - no further action required

    ' The website was not pingable, write it to a logfile
    RecordSingleEvent

    ' The website was not pingable five times in a row, log it to the eventlogger
    If fout = 5 then
        Set WshShell = WScript.CreateObject("WScript.Shell")
        Call WshShell.LogEvent(1, "Test Event")
    End if

Next

' We are done.
WScript.Quit
于 2013-11-06T09:49:59.377 に答える