Array

  • Hallo zusammen,
    ich benötige eure Hilfe für ein Logikproblem, das ich schon den ganzen Tag versuche zu lösen.
    Ich muß in regelmäßigen Abständen die Seitenzähler der Drucker auslesen.
    Bisher habe ich das per copy & paste über die Eingabeaufforderung mit "snmpget ip public oid" gemacht.
    Dafür hatte ich mir 3 Textdateien angelegt. Datei 1 beinhaltet die IP's, Datei 2 die Modellnamen und Datei 3 die oid's die abgefragte werden sollen.
    Jetzt würde ich das gerne automatisieren, wofür ich mir hier aus dem Forum und aus der Hilfe dieses Script gebastelt habe. Es läuft auch, allerdings bekomme ich nur die Daten des in der 2ten Zeile eingetragenen Druckers zurück.
    Wo liegt denn der Fehler, oder ist das so vielleicht überhaupt nicht umsetzbar?

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #Include <Array.au3>

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

    Local $pid, $ausfuehren, $aIP, $aModell, $aMib

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

    _FileReadToArray(@ScriptDir & "\ip.txt", $aIP)
    _ArrayDisplay($aIP, "IP")
    For $x = 1 to $aIP[0]
    $ip = ($aIP[$x])
    Next
    _FileReadToArray(@ScriptDir & "\modell.txt", $aModell)
    _ArrayDisplay($aModell, "Modell")
    For $y = 1 to $aModell[0]
    $modell = ($aModell[$y])
    Next
    _FileReadToArray(@ScriptDir & "\" & $modell & ".txt", $aMib)
    _ArrayDisplay($aMib, "Modell.txt")
    For $z = 1 to $aMib[0]
    $mib = ($aMib[$z])

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

    $ausfuehren = _snmp(@ComSpec & " /c " & "snmpget -v1 -c public " & $ip & chr(32) & $mib)

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

    Next

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

    Func _snmp($cmd)
    $pid = Run($cmd, @TempDir , "", 2)
    $ausfuehren = ""
    While 1
    $ausfuehren &= StdoutRead($pid)
    If @error Then ExitLoop
    Wend
    FileWrite(@ScriptDir & "\snmpget.txt", $ausfuehren)
    Return $ausfuehren
    EndFunc

    [/autoit]
    Spoiler anzeigen


    ip.txt
    192.168.1.10
    192.168.1.11
    .
    .
    usw.

    modell.txt
    HPLJ4200
    HPLJ4250
    .
    .
    usw.

    HPLJ4200.txt
    1.3.6.1.4.1.11.2.4.3.5.2.0
    1.3.6.1.2.1.43.5.1.1.17.1
    1.3.6.1.2.1.43.10.2.1.4.1.1

    HPLJ4250.txt
    1.3.6.1.4.1.11.2.4.3.5.2.0
    1.3.6.1.2.1.43.5.1.1.17.1
    1.3.6.1.2.1.43.10.2.1.4.1.1

    Gruß Anna

    Einmal editiert, zuletzt von anna (18. März 2011 um 19:40)

  • Hallo Anna,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die deutsche Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deiner Frage, ich weiss dass ich genau diese Problembeschreibung schon gelesen habe und dass das Problem ach gelöst wurde (ob der Thread allerdings auch auf gelöst steht ist fraglich, da viele User sehr nachlässig damit umgehen).
    Aber stell bitte alle Textdateien ein, was man af den 1. Blick sieht ist es logisch dass d nr den 2. erhälst, da du ja $ip immer die nächste zuweist ohne dazwischen etwas aufzurfen. Sprich es wird immer der letzte Wert abgearbeeitet,

    mfg atoBert

    • Offizieller Beitrag

    Hi Anna,
    hier liegt der Hund begraben

    [autoit]

    For $x = 1 to $aIP[0]
    $ip = ($aIP[$x])
    Next

    [/autoit]

    analog in den anderen For-Schleifen.
    Du durchläufst das Array und weist den Inhalt der Variablen $ip zu - aber machst dann nichts weiter damit. Somit hat die Variable nur den Inhalt des letzten Eintrages.
    Du mußt also innerhalb der Schleife den sich ändernden Wert auch anwenden. ;)
    Gibt es für jede IP exakt einen Modellnamen und eine OID?
    Dann brauchst du nur eine einzige Datei (und demzufolge nur ein Array).

  • Hallo autoBert ,
    die fehlenden Dateien haben ich angehängt. Ich war schon auf der Suche, hatte aber nichts gefunden oder nicht als Lösung erkannt.

    Hallo BugFix,
    das es ein Fehler in den For-Schleifen ist, hatte ich vermutet. Dashalb hab ich auch heute fast jeden Beitrag der auch nur annähernd was mit Arrays zu tun hatte, durchstöbert. Warum ich das über die 3 Dateien umstetzen möchte, hat folgenden Grund. Der Plan ist natürlich, dieses Basis Script weiter zu automatisieren und auszubauen, z.b. IP Scan, einfaches hinzufügen von neuen Geräten durch erstellen einer einfachen Datei mit den benötigten OID's .Das Script bleibt dadurch flexibel, so der theoretische Plan ;-). Jede Zeile in der ip.txt & modell.txt ist ein Paar.

  • Hallo anna,

    hier einmal ein Ansatz, den ich aber nicht testen kann:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #Include <Array.au3>

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

    Local $aIP, $aModell

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

    _FileReadToArray(@ScriptDir & "\ip.txt", $aIP)
    _FileReadToArray(@ScriptDir & "\modell.txt", $aModell)
    Local $aPrinter[$aIP[0]+1][4]
    For $x = 1 to $aIP[0]
    $aPrinter[$x][0] = $aIP[$x]
    $aPrinter[$x][1] = $aModell[$x]
    $aPrinter[$x][2] = FileRead(@ScriptDir & "\" & $aModell[$x] & ".txt") ;Pfad anpassen
    _checkPrinter($aPrinter[$x][0],$aPrinter[$x][2],$aPrinter[$x][3])
    Next
    _ArrayDisplay($aPrinter)

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

    Func _checkPrinter($sIP,$sMib,ByRef $sRet)
    Local $aMib = StringSplit(StringStripWS($sMib,3),@crlf,1)
    _ArrayDisplay($aMib)
    for $y = 1 to $aMib[0]
    $sRet &= _checkCounter($sIP,$aMib[$y]) ;Zählwerk-Rückgabe anhängen
    if $y < $aMib[0] Then $sRet &= "|" ;Trenneichen einfügen, damit wieder gesplittet werden kann
    Next
    EndFunc

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

    Func _checkCounter($sIP, $sMib)
    Local $sRet
    Return $sRet = _snmp(@ComSpec & " /c " & "snmpget -v1 -c public " & $sIP & chr(32) & $sMib)
    EndFunc

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

    Func _snmp($cmd)
    $pid = Run($cmd, @TempDir , "", 2)
    $ausfuehren = ""
    While 1
    $ausfuehren &= StdoutRead($pid)
    If @error Then ExitLoop
    Wend
    FileWrite(@ScriptDir & "\snmpget.txt", $ausfuehren)
    Return $ausfuehren
    EndFunc

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

    #cs Ursprung Anna
    #include <File.au3>
    #Include <Array.au3>

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

    Local $pid, $ausfuehren, $aIP, $aModell, $aMib

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

    _FileReadToArray(@ScriptDir & "\ip.txt", $aIP)
    _ArrayDisplay($aIP, "IP")
    For $x = 1 to $aIP[0]
    $ip = ($aIP[$x])
    Next
    _FileReadToArray(@ScriptDir & "\modell.txt", $aModell)
    _ArrayDisplay($aModell, "Modell")
    For $y = 1 to $aModell[0]
    $modell = ($aModell[$y])
    Next
    _FileReadToArray(@ScriptDir & "\" & $modell & ".txt", $aMib)
    _ArrayDisplay($aMib, "Modell.txt")
    For $z = 1 to $aMib[0]
    $mib = ($aMib[$z])

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

    $ausfuehren = _snmp(@ComSpec & " /c " & "snmpget -v1 -c public " & $ip & chr(32) & $mib)

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

    Next

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

    Func _snmp($cmd)
    $pid = Run($cmd, @TempDir , "", 2)
    $ausfuehren = ""
    While 1
    $ausfuehren &= StdoutRead($pid)
    If @error Then ExitLoop
    Wend
    FileWrite(@ScriptDir & "\snmpget.txt", $ausfuehren)
    Return $ausfuehren
    EndFunc
    #ce

    [/autoit]

    sollte aber laufen wenn deine func _snmp und der Aufruf dazu gestimmt haben,

    mfg autoBert

  • Hallo autoBert,

    dein Code läuft wie geschmiert. Ganz große Klasse!
    Herzlichen Dank für deine spitzenmäßige Unterstützung.

    Gruß Anna

  • Hallo Anna,

    so etwas liest man gerne, noch lieber würde ich allerdings lesen dass der Thread gelöst ist. Einfach 1. Beitrag bearbeiten, Präfix (nähe Überschrift) ändern und speichern (absenden)

    mfg autoBert