Newbie Probleme mit einem Array-Konstrukt

  • Hallo,

    ich bin neu in der AutoIT - Welt und hab gleich mal ein dringendes Problem das ich schon seit 2 Stunden nicht gelöst bekomm:

    Ich habe eine GUI-Edit box in der Werte nach vollgendem Muster stehen:
    PCNAMExy,PFAD
    PCNAMEabc,PFAD
    ...

    nun möchte ich mit meinem script jeweils den oben eingegebenen pfad auf einem netzwerkcomputer nach pst-dateien absuchen, und dieses ergebnis in einem array zurückgeben - das suchen klappt soweit, nur bekomm ich den array nicht hin. er sollte so aufgebaut sein:

    $pstarray[Computername][name_der_pstdatei][Größe_der_datei]

    anschließend möchte ich diesen array verarbeiten können, un zum Bespiel die Größe der Pst-Datei(en) von Computer xyz summieren und mir diese summe zusamm mit dem pfad und namen der datei(en) ausgeben lassen.

    kann mir jemand folgen !? :teufel: ... und Vielleicht helfen !?
    ich bekomms einfach nicht hin.
    :hammer:

  • Hi,

    hab da mal was zusammengebastelt ;)

    [autoit]


    Func _getPstFiles($pcname, $Pfad)
    Local $i=0
    Local $pstFiles[1][3]
    $search = FileFindFirstFile($pfad&"\*.pst")
    If $search = -1 Then
    MsgBox(0,"","Uuuuuups, Keine PST-Dateien gefunden!")
    Else
    While 1
    ReDim $pstFiles[$i+1][3]
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    $pstFiles[$i][0]=$pcname
    $pstFiles[$i][1]=$file
    $pstFiles[$i][2]=FileGetSize($pfad&"\"&$file)
    $i += 1
    WEnd
    Return $pstFiles
    EndIf
    EndFunc

    [/autoit]
  • Hey Danke für die Antwort.
    Hab noch etwas daran rumgeschnipselt ...
    Hier mal mein Code:

    [autoit]


    Func GetPSTfilesizes_Remote($pc,$path)
    Local $pstfilesex[10][10]
    Logg("looking at " & $pc & " - " & $path,$LOGDEBUG)
    Local $pstfiles = _FileListToArrayEx("\\" & $pc & "\" & $path, '*.pst', 0, '', True)
    If @error <> 0 Then Exit MsgBox (0,"Fehler:" & @error,"Keine PST Dateien gefunden !")
    Logg("Found " & $pc & ": (" & $pstfiles[0] & ") => " & $pstfiles[1],$LOGDEBUG)
    For $i = 0 To $pstfiles[0]
    $pstfilesex[$i][0] = $pstfiles[0]
    $pstfilesex[$i][1] = $pstfiles[$i]
    $pstfilesex[$i][2] = FileGetSize($pstfiles[$i])
    Next
    Return $pstfilesex
    EndFunc

    [/autoit]

    und

    [autoit]


    Local $lines = StringSplit(GUICtrlRead($EPCs1),@LF)
    For $i = 1 To $lines[0] ; count of entered pcs,path
    Local $line = StringSplit($lines[$i],",")
    Local $pstfiles = GetPSTfilesizes_Remote(StringStripCR($line[1]),StringStripCR($line[2]))
    Logg(@CRLF & $line[1] & ": ",$LOGOUTPUT)
    Local $pstsizesumme = 0
    For $j = 1 To $pstfiles[0][0]
    If $pstfiles[$j][2]/1024/1024 >= 1500 Then
    Logg($pstfiles[$j][1] & " => " & $pstfiles[$j][2],$LOGERROR)
    EndIf
    Logg($pstfiles[$j][1] & " => " & $pstfiles[$j][2],$LOGOUTPUT)
    $pstsizesumme =+ $pstfiles[$j][2]
    Next
    Logg("Gesammt: " & Round($pstsizesumme/1024,2) & " KB | " & Round($pstsizesumme/1024/1024,2) & " MB | " & Round($pstsizesumme/1024/1024/1024,2) & " GB",$LOGOUTPUT)
    Next

    [/autoit]

    Für Anregungen / Verbesserungen bin ich immer zu haben, fange ja gerade erst mit AutoIT an.

    Ich habe mich ziemlich an der Array-Behandlung aufgehängt.
    Vovon ich ausgegangen bin - was wohl nur bedingt stimmt - dass in jedem
    array[0] die anzahl der elemente steckt.
    Das scheint aber nur in einem Eindimensionalen Array der Fall zu sein.

    FRAGE: Wie komm ich bei mehrdimensionalen Arrays an die Anzahl der Elemente? Gibt es sowas wie eine Eigenschaft Count o. Length ??
    Gibt es sowas wie Assoziative Arrays !? => array["bez1"]["bez2"]
    Die Arraybehandlung ist wirklich kompliziert gemacht :(

    • Offizieller Beitrag

    Hi!


    Die Arraybehandlung ist nicht besonders kompliziert, finde ich. Man muss halt einmal nachlesen oder sich sagen, wie es ist ;)

    Elemente gehen immer von 0 bis n. Es gibt Funktionen, die in [0] die Anzahl der Treffer stecken, das ist aber nicht immer so. Infos dazu liefert jeweils die Hilfe.

    UBound($array) liefert die Anzahl der Elemente.

    Assoziative Arrays gibt es nicht.


    peethebee

  • Zitat


    Die Arraybehandlung ist nicht besonders kompliziert, finde ich. Man muss halt einmal nachlesen oder sich sagen, wie es ist ;)


    vielleicht nicht kompliziert - aber ungewohnt :) - werd damit mal in ner ruhigen minute ausgiebig spielen.

    Zitat


    UBound($array) liefert die Anzahl der Elemente.


    Klasse !! dann werd ich gleich mal meine [0] durch obige Funktion ersetzen.

    Danke für deine Antworten.

  • :hm:

    Zitat


    Ubound:
    Returns the size of array dimensions.

    das heißt do ein

    [autoit]


    dim $myarray[10][10]
    $myarray[1][1]="test"
    msgbox(0,"",ubound($myarray,2))

    [/autoit]


    liefert mir 10 zurück - anstatt 1 !
    wieviel dimensionen der array hat, weiß ich - ich hab ihn ja selbst erzeugt - was ich suche ist wie ich die ANZAHL DER ELEMENTE eines Arrays bekomme !
    Hoff hierfür gibts auch ne lösung
    :tier:

  • Er möchte gerne wissen, wie er herrausfindet, wieviel Stellen auch wirklich genutzt werden. Weil jetzt sieht das Array so aus:

    x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
    -----------------------------------------------------
    1 | |"test"| ....
    -----------------------------------------------------
    2 | | | ...
    -----------------------------------------------------
    3 | | | ...
    -----------------------------------------------------
    4 | |
    -----------------------------------------------------
    5 | |
    -----------------------------------------------------
    6 | |
    -----------------------------------------------------
    7 | |
    -----------------------------------------------------
    8 | |
    -----------------------------------------------------
    9 | ...

    Wenn du mit einem 1-dimensionalen Array arbeitest, dann kannste mit der Array.au3 (UDF) deine Arrays immer dynamisch erweitern, dann sagt dir UBound auch wirklich wieviel belegt sind.

    So kannst du nur eine Schleife machen, die zählt, wenn eine Stelle belegt ist:

    [autoit]

    Dim $Treffer = 0
    For $i = 0 To UBound($myArray,1) -1
    For $n = 0 To UBound($myArray,2)-1
    If myArray[$i][$n] <> "" Then
    $Treffer += 1
    EndIf
    Next
    Next

    [/autoit]
  • super ! :klatschen:
    genau das was ich gesucht hab. Sollte ich mir gleich mal als UDF ablegen.
    hatte nur gehofft es geht einfacher - aber hauptsache es geht irgendwie.

    Zitat

    Wenn du mit einem 1-dimensionalen Array arbeitest, dann kannste mit der Array.au3 (UDF) deine Arrays immer dynamisch erweitern


    du meinst warscheinlich dann die Funktion _ArrayAdd
    dh. ich könnte so arbeiten:

    [autoit]

    local $myarr[1]
    _ArrayAdd($myarr,"somestuff")
    _ArrayAdd($myarr,"someotherstuff")
    msgbox(0,"Myarr-Anzahl-Elemente",Ubound($myarr))

    [/autoit]


    - und damit bekomm ich dann wirklich die anzahl elemente in meinem array.
    oder hab ich das nun falsch verstanden

    Dann habe ich eigentlich nur noch eine letzte (OT) Frage:
    ich möchte einen formatierten string ausgeben - und zwar eine byte-angabe durch punkte getrennt,
    also meine variable hat als inhalt zbsp: 321233443 -> soll geben:
    321.233.443 byte
    ich denke dass ich hierfür die stringformat funktion verwenden kann - allerdings komme ich mit den format-anweißungen nicht ganz klar.
    wenn ich das ganze auf MB teile und als float ausgebe, bekomme ich ja nur eine nachkommastelle.
    wie kann ich das sonst machen !?

    Danke für eure Geduld ;)

  • Bei Tausenderpunkte würde ich einfach bei der Ausgabe wieder eine UDF verwenden :)

    String.au3 -> _StringAddComma
    und das Byte dann einfach anhängen.

    Bei MB einfach die 321233443 / 1024 machen und dann wie oben mit der Funktion mit Komma und deinem Endnamen zusammenbringen.