stdout zu array

  • Hallo,

    ich möchte mich erstmal bedanken für die vielen nützlichen Tipps und Tutorials im Forum. Echt Klasse!!!!! Trotzdem haben ich ein Problem, wo ich weiter weiß. :(

    Ich möchte mit AutoIt eine kleine GUI basteln, wo ich schnell und Übersichtlich Auslastungen und Stats meines Servers sehe. Jetzt habe ich eine User Liste die ich per "STDout" im folgenden Format bekomme:

    User RAM Path
    abcd123 20% /usr/lib/firefox
    abcd345 23% /usr/lib/soffice

    Diese Werte sind per Tab getrennt. Ich möchte jetzt die Ausgabe in einen Array packen, um diese in ein Listview anzuzeigen und anschließend einzeln anzusprechen.

    Ich habe aber nirgends einen Lösungsweg gefunden und soviel ausprobiert, dass mir der Kopf qualmt und ich gar nichts mehr weiß :( Vlt. kann mir ja jemand Anhaltspunkte oder Ideen geben, wie ich das umsetzen kann.

    Mein AutoIT Code gleicht eigentlich ungefähr dem 1. Thread hier: #mce_temp_url#

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <ProgressConstants.au3>
    #include <WindowsConstants.au3>

    $GUI = GUICreate("Test", 270, 329, 248, 123)
    $List = GUICtrlCreateList("", 8, 8, 249, 227)
    GUICtrlSetData(-1, "")
    $ProgressBar = GUICtrlCreateProgress(8, 248, 249, 25)
    $ButtonStart = GUICtrlCreateButton("Start!", 8, 288, 250, 25)
    GUISetState(@SW_SHOW)

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ButtonStart
    Example()
    EndSwitch
    WEnd

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

    Func Example()
    GUICtrlSetData($List, _ReadDos('C:\wget.exe https://autoit.de/&quot;http://w…setup.exe&quot;) & @CRLF)
    EndFunc

    Func _ReadDOS($command)
    Local $text = '', $Pid = Run('"' & @ComSpec & '" /c ' & $command, '', @SW_HIDE, 2+4)
    While 1
    $text &= StdoutRead($Pid, False, False)
    If @error Then ExitLoop
    Sleep(10)
    WEnd
    Return $text
    EndFunc

    [/autoit]


    Beste Grüße
    Zeus

    Einmal editiert, zuletzt von Zeus2012 (7. Dezember 2012 um 14:30)

  • Kommt drauf an, wie der Output wiklich ausschaut, aber am besten nimmt du StringRegExp

    [autoit]

    #include <Array.au3>

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

    $sStdOut = "User RAM Path" & @CRLF & _
    "abcd123 20% /usr/lib/firefox" & @CRLF & _
    "abcd345 23% /usr/lib/soffice"

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

    $aStdOut = _StdOut($sStdOut)
    _ArrayDisplay($aStdOut)

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

    Func _StdOut($sStdOut)
    Local $aStdOut[1][3] = [[0]], $iCnt = 0

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

    Local $aRegExp = StringRegExp($sStdOut, "(\w+)\h+(\d+%)\h+([^\r\n]+)", 3)

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

    If IsArray($aRegExp) Then
    $iCnt = UBound($aRegExp) / 3
    ReDim $aStdOut[$iCnt + 1][3]
    $aStdOut[0][0] = $iCnt

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

    For $i = 0 To $iCnt - 1
    $aStdOut[$i + 1][0] = $aRegExp[$i * 3]
    $aStdOut[$i + 1][1] = $aRegExp[$i * 3 + 1]
    $aStdOut[$i + 1][2] = $aRegExp[$i * 3 + 2]
    Next
    EndIf

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

    Return $aStdOut
    EndFunc ;==>_StdOut

    [/autoit]

    E

  • Vielen dank für die schnellen Antworten aber ich habe das problem, dass es mir nun nichts mehr darstellt :(

    Hier der AutoIT Code:

    [autoit]


    ; Include Systemfiles
    #include <Constants.au3>
    #include <Process.au3>
    #include <Array.au3>
    ; Include GUI
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>

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

    $Form1_1 = GUICreate("NX", 812, 577, 192, 124)
    $Tab1 = GUICtrlCreateTab(24, 24, 657, 465)
    $TabSheet1 = GUICtrlCreateTabItem("NX")

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

    $Label2 = GUICtrlCreateLabel("Liste alle Nutzer", 36, 137, 79, 17)
    $zeige_liste = GUICtrlCreateButton("Zeige Liste", 180, 129, 89, 25)
    $NX_User = GUICtrlCreateList("", 36, 169, 633, 303, BitOR($LBS_NOTIFY,$LBS_SORT,$LBS_USETABSTOPS,$WS_VSCROLL))
    GUICtrlSetData(-1, "")

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

    $TabSheet2 = GUICtrlCreateTabItem("Resourcen")
    GUICtrlCreateTabItem("")
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $zeige_liste
    _zeige_liste()
    EndSwitch
    WEnd

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

    ; Funktion NX Sessions anzeigen
    Func _zeige_liste()
    $stream = Run("C:\AUTOIT\SSH\plink.exe -l root -pw PASSWORT 0.0.0.0 nxserver --list", "", @SW_HIDE,$STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)
    $line = StdoutRead($stream)
    _ArrayDisplay($line)
    Local $line[1][3] = [[0]], $iCnt = 0

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

    Local $lineRegExp = StringRegExp($stream, "(\w+)\h+(\d+%)\h+([^\r\n]+)", 3)

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

    If IsArray($lineRegExp) Then
    $iCnt = UBound($lineRegExp) / 3
    ReDim $line[$iCnt + 1][3]
    $line[0][0] = $iCnt

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

    For $i = 0 To $iCnt - 1
    $line[$i + 1][0] = $lineRegExp[$i * 3]
    $line[$i + 1][1] = $lineRegExp[$i * 3 + 1]
    $line[$i + 1][2] = $lineRegExp[$i * 3 + 2]
    Next
    EndIf
    Return $line

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

    EndFunc

    [/autoit]

    Und hier die Ausgabe die der CMD:

    [autoit]


    Server Display Username Remote IP Session ID
    ------ ------- --------------- --------------- --------------------------------
    127.0.0.1 10031 abcd123 0.0.0.1 000C553CC2AAE10750C409446B66D753
    127.0.0.1 10024 abcd234 0.0.0.2 0F89288116D778E689BBA07EACADEA95
    127.0.0.1 10050 abcd567 0.0.0.3 0F99AED3356C2B06BAAAAA9CEDDDDC76

    [/autoit]

    Beste Grüße
    Zeus

  • chesstiger

    Vielen dank für den Tipp. Hat hervoragend funktioniert. Habe nun folgende Funktion:

    [autoit]


    GUI:

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

    $NX_User = GUICtrlCreateListView("Server|Display|Benutzername|IP|Session ID", 36, 169, 633, 303, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_SORTDESCENDING))
    ; Sortieren
    Global $fSortDescending = False
    $hButton = GUICtrlCreateButton("Sortieren", 20, 400, 80, 30)
    $hLabel = GUICtrlCreateLabel("", 100, 405, 200, 20)

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

    Funktion:

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

    Func _zeige_liste()
    $stream = Run("C:\AUTOIT\SSH\plink.exe -l root -pw PASSWORT 192.168.2.105 nxserver --list", "", @SW_HIDE,$STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)
    While 1
    $line = StdoutRead($stream)
    If @error Then ExitLoop
    If $line <> "" then
    ; Lösche Zusatzinfos
    $line = StringReplace($line, @CRLF & @CRLF, @CRLF)
    $line = StringReplace ($line, "Server Display Username Remote IP Session ID", "")
    $line = StringReplace ($line, "------ ------- --------------- --------------- --------------------------------", "")
    $line = StringReplace ($line, "'s current affinity list: 0-15", "")
    $line = StringReplace ($line, "new affinity list: 1-15", "")

    ; Ersetze Tab
    $line = StringReplace ($line, @TAB, "|")
    ; Ersetze Umlaute
    $line = StringReplace ($line, chr(129), "ü")
    $line = StringReplace ($line, Chr(154), "Ü")
    $line = StringReplace ($line, Chr(142), "Ä")
    $line = StringReplace ($line, Chr(132), "ä")
    $line = StringReplace ($line, Chr(153), "Ö")
    $line = StringReplace ($line, Chr(148), "ö")
    ; Füge Daten in Liste ein
    $inhalt = StringSplit($line, "@TAB")
    $inhalt_setzen = GUICtrlCreateListViewItem($line, $NX_User)
    GUISetState()
    GUICtrlSetData($inhalt, "ITEM1")
    ; DEBUG MODE GUICtrlSetData($NX_User, GUICtrlRead($NX_User) & $line)
    Local $file = FileOpen("test.txt", 1)
    FileWriteLine($file, GUICtrlRead($NX_User) & $line)
    EndIf
    Wend
    EndFunc

    [/autoit]