Ping funktion zum scannen ob PC On oder Offline ?

  • Huhu an alle,

    ich habe da mal wieder ein Problemchen. Bin gerade dabei eine kleine Abfrage zu Programmieren ob ein bestimmter Eventlog auf den Netzwerkcomputern geschrieben wurde. Nun wollte ich noch eine Funktion einbauen, die erst mal den PC anpingen soll, Falls kein Ping vorhanden soll er den nächsten PC scannen. Allerdings dauert mir das zu lange mit der Pingfunktion und wollte mal nachfragen, welche Möglichkeit es da noch gibt.

    Spoiler anzeigen
    [autoit]

    Func _AllePCs()
    $listview = GUICtrlCreateListView("PC Nummer | Bericht", 150, 50, 396, 250, 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    local $pc[28] = ["pc01","PC02","PC03","PC04","PC05","PC06","PC07","PC08","PC09","PC10","PC11","PC12","PC13","PC14","PC15","PC16","PC17","PC18","PC19","PC20","PC21","PC22","PC23","PC24","PC25","PC26","PC27","PC28"]
    ;local $pc[2]= ["pc19","PC14"]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $a = 0 to UBound($pc) -1 ;Schleife zum PCs hochzählen

    [/autoit] [autoit][/autoit] [autoit]

    Local $var = Ping($pc[$a], 1)

    [/autoit] [autoit][/autoit] [autoit]

    $EventLog = _EventLog__Open ($pc[$a], "Application")
    $EventlogCount = _EventLog__Count ($EventLog)
    $search = 0
    If $var Then
    For $i = 1 to $EventlogCount
    $Eventread = _EventLog__Read($EventLog, True, False)
    $search = $search +1
    GUICtrlSetData($Progress1, ($search * 100 ) / $EventlogCount)

    [/autoit] [autoit][/autoit] [autoit]

    If $Eventread[10] = "MyDefrag wurde geXt " Then
    GUICtrlSetData($Progress1, $EventlogCount)
    GUICtrlCreateListViewItem($pc[$a] & "| MyDefrag wurde beendet", $ListView)
    EndIf
    Next
    Else

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    _EventLog__Close ($EventLog)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]

    Wäre super wenn ich ein paar Tips bekommen könnte.

    LG Susie

    Einmal editiert, zuletzt von Susie1703 (14. November 2012 um 07:32)

  • In etwa so:

    Spoiler anzeigen
    [autoit]

    _PingAll()

    [/autoit] [autoit][/autoit] [autoit]

    Func _PingAll()
    Local $name, $PC[28]
    DirRemove(@TempDir&'\ping\')
    DirCreate(@TempDir&'\ping\')
    For $i = 1 To 28
    $name = 'PC'
    If $i < 10 Then $name &= '0'
    $name &= $i
    $PC[$i-1] = $name
    $PID = Run(@ComSpec&' /c ping '&$name&' > '&@TempDir&'\ping\'&$name,@TempDir,@SW_HIDE)
    Next
    Do
    Sleep(50)
    Until Not ProcessExists('cmd.exe')
    For $i = 1 To 28
    If StringLeft(FileRead(@TempDir&'\ping\'&$PC[$i-1]),16) <> 'Ping-Anforderung' Then
    ; ...
    ConsoleWrite($PC[$i-1] & @LF)
    ; ...
    EndIf
    Next
    DirRemove(@TempDir&'\ping\')
    EndFunc

    [/autoit]

    Jaa ich weis da fehlen noch Fehlerabfragen... ^^

    LG
    Christoph :)

  • Naja so wie ich dein Script anschaue ist dein Ping doch ohnehin sinnfrei, da du das eventlogOpen und eventlogCount auch dann machst, wenn der Rechner nicht auf einen Ping reagiert hat. Das wäre im Übrigen auch mein Änderungsvorschlag. Lass den Ping weg und reagiere einfach auf den Fehlerrückgabewert von eventlogOpen. Wenn das Handle nicht erstellt wird gehts mit dem nächten Rechner weiter (continueloop).

    EDIT:

    [autoit]

    Until Not ProcessExists('cmd.exe')

    [/autoit]

    Schlechte Idee, was passiert wohl wenn zufälligerweise noch eine andere cmd.exe Instanz neben den unzähligen Pings existiert? Richtig, Endlosschleife! ;)

  • misterspeed:

    Danke für den Hinweis das ich ja so oder so das eventlogOpen mache. Ist mir vor lauter Code schauen nicht mehr aufgefallen.

    Habe es nun vorläufig doch mit dem Ping gelassen, reicht im Moment auch aus, wenn ich dann mal Zeit zum verfeinern des ganzen habe, werde ich aber auf jeden Fall die Variante mit der Fehlerrückgabe einbauen. Bin halt noch ein blutiger Anfänger mit AutoIt (eigentlich bei allem was Scripten und Programmieren angeht).