Probleme mit array ?

  • Hallo zusammen

    ich hab folgenden Code:

    [autoit]

    #include <_GetFilesFolder_Rekursiv.au3>
    #include <File.au3>
    #include <String.au3>

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

    $sPath="D:\"
    $iDir=1
    $iRetType=1
    $array=_GetFilesFolder_Rekursiv($sPath, $iDir, $iRetType)
    $i=1
    $y=0
    $x=0
    DIM $String
    DIM $Pfad
    While $i <= UBound($array)

    $String=_StringSplit($array[$i],"\")
    While $x <= UBound($String)
    If $String[$x] == "2009" Then $Pfad[$y] = $array[$i]
    If $Pfad[$y] > 1 Then $y = $y+1
    $x = $x+1
    WEnd
    $x = 0
    $i = $i +1
    WEnd
    MsgBox(0,"test", $y)

    [/autoit]

    Wenn ich ihn ausführe, erhalte ich folgende Fehlermeldung:

    Code
    :\AUTOIT\Jahreswechsel.au3 (27) : ==> Subscript used with non-Array variable.:
    If $Pfad[$y] > 1 Then $y = $y+1
    If $Pfad^ ERROR

    Ich vermute mal, das er ein Problem mit dem Array hat, aber ich blick es nicht ganz.

    Im Detail, was ich vor habe:
    Ich möchte einen Pfad durchsuchen lassen und alle Ordner die 2009 enthalten finden und dort einen Ordner 2010 erstellen lassen. Also durchsuche ich alle Ordner und lasse sie in ein Array schreiben, diese Array splitte ich in einzelne Strings auf und suche nach 2009. Die Ergebnise lasse ich mir dann wieder in eine neues Array schreiben, damit ich am ende nur noch ein Array habe, in dem dann alle Pfade mit 2009 drinstehen.


    Bin für jeden Tipp dankbar.

    Einmal editiert, zuletzt von CrazyER (9. Dezember 2009 um 09:15)

  • Also es soll nach Ordnern gesucht werden, deren Name "2009" enthält, oder deren Namen "2009" IST ?

    Hier meine Version:

    [autoit]

    #include <_GetFilesFolder_Rekursiv.au3>
    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>
    $array=_GetFilesFolder_Rekursiv("D:\", 1, 1)
    DIM $String, $sPfad, $aPfad, $sNowPath, $aNowPath
    For $i = 1 to $array[0]
    $String=StringSplit($array[$i],"\")
    If $String[$String[0]-1] == "2009" Then
    $sPfad &= $array[$i]&"|"
    EndIf
    Next
    If $sPfad <> "" then
    $aPfad = StringSplit(StringTrimRight($sPfad,1),"|")
    For $i = 1 to $aPfad[0]
    $aNowPath = StringSplit($aPfad[$i],"\")
    For $x = 1 to $aNowPath[0]-2
    $sNowPath &= $aNowPath[$x]&"\"
    Next
    If Not FileExists($aNowPath[$x]&"\"&"2010") Then DirCreate($aNowPath[$x]&"\"&"2010")
    ConsoleWrite($aNowPath[$x]&"\"&"2010"&@CRLF)
    Next
    Else
    MsgBox(0,"","nichts gefunden")
    EndIf

    [/autoit]
  • Hallo CrazyER!

    Habe dir auf die schnelle was gezaubert nur noch kleine Verfeinerungen und dann sollte es klappen!


    SEuBo
    Also bei mir tut sich garnichts mit denen code! Ausser das es mir in der konsole 2009\2010 anzeigt!


    Spoiler anzeigen
    [autoit]

    #include <_GetFilesFolder_Rekursiv.au3>
    #include <File.au3>
    #include <String.au3>
    Dim $y = 0, $len, $result

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

    $array = _GetFilesFolder_Rekursiv('D:\', 1, 1)

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

    For $i = 1 To UBound($array) - 1

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

    $string = StringSplit($array[$i], '\', 1)

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

    For $n = 1 To UBound($string) - 1

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

    If $string[$n] = 2009 Then $len = StringLen($array[$i])
    $result = StringLeft($array[$i], $len - 1)

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

    MsgBox(0, 'Test', $result)

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

    Next
    Next

    [/autoit]


    LG Kleiner

  • Mein Fehler. Hatte nen Kleinen Fehler drin - hab irgendwie übersehen dass es nicht klappt :O

    Hier das funktionierende:

    Spoiler anzeigen
    [autoit]

    #include <_GetFilesFolder_Rekursiv.au3>
    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>
    $array=_GetFilesFolder_Rekursiv("D:\Musik", 1, 1)
    DIM $String, $sPfad, $aPfad, $sNowPath, $aNowPath
    For $i = 1 to $array[0]
    $String=StringSplit($array[$i],"\")
    If $String[$String[0]-1] == "Kool Savas" Then
    $sPfad &= $array[$i]&"|"
    EndIf
    Next
    If $sPfad <> "" then
    $aPfad = StringSplit(StringTrimRight($sPfad,1),"|")
    For $i = 1 to $aPfad[0]
    $aNowPath = StringSplit($aPfad[$i],"\")
    For $x = 1 to $aNowPath[0]-2
    $sNowPath &= $aNowPath[$x]&"\"
    Next
    If Not FileExists($sNowPath&"2010") Then DirCreate($sNowPath&"2010")
    ConsoleWrite($sNowPath&"2010"&@CRLF)
    $sNowPath = ""
    Next

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

    Else
    MsgBox(0,"","nichts gefunden")
    EndIf

    [/autoit]
  • erstmal danke euch beiden. Eigentlich war mein Ansatz ja garnicht soooooo schlecht :o))

    ich habe mich nun für die Methode von SEuBo entschieden, funktioniert auch gut. Muss nur noch das DirCreate gegen ein Robocopy Befehl tauschen.

    Aber irgendwie gehen mir die einzelne Schritte deiner Logik noch nicht ganz in den Kopf. Wäre es zuviel verlangt, wenn du mir erklären könntest, was welcher Schritt genau macht ? Dann wäre für mich auch noch ein Lerneffekt dabei.

  • Klar kein Problem, hier mal eine auskommentierte Version

    Spoiler anzeigen
    [autoit]

    #include <_GetFilesFolder_Rekursiv.au3>
    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>
    $array=_GetFilesFolder_Rekursiv("D:\Musik", 1, 1)
    DIM $String, $sPfad, $aPfad, $sNowPath, $aNowPath
    For $i = 1 to $array[0]
    $String=StringSplit($array[$i],"\") ; Teilt den jetzigen Pfad an den "/" auf.
    If $String[$String[0]-1] == "Kool Savas" Then ; Falls das letzte Element den gewünschten Namen trägt,
    _ArrayDisplay($String,'StringSplit($array[$i],"\")')
    $sPfad &= $array[$i]&"|" ; Dann füge es den Pfad dem String, welcher die gefundenen Pfade enthält, hinzu.
    ; Hier könnte man auch mit _ArrayAdd() arbeiten und alles in einen neuen Array schreiben,
    ;aber die String-Variante ist schneller, da der Array nicht jedes mal mit ReDim verändert werden muss.
    EndIf
    Next
    MsgBox(0,"Pfade","Die gefundenen Pfade (durch | getrennt) sind die folgenden: "&@LF&@LF&$sPfad&@LF&@LF&"Wie du siehst, ist am Ende noch ein | zu viel. Deswegen benutze ich in Zeile 18 StringTrimRight")
    If $sPfad <> "" then ; wenn Pfade gefunden wurden,
    $aPfad = StringSplit(StringTrimRight($sPfad,1),"|") ; erstelle daraus einen Array.
    _ArrayDisplay($aPfad, 'StringSplit(StringTrimRight($sPfad,1),"|")')
    For $i = 1 to $aPfad[0] ; die gefundenen Pfade werden durchgegangen,
    $aNowPath = StringSplit($aPfad[$i],"\") ;hier wird der jetzige Pfad wieder aufgeteilt
    For $x = 1 to $aNowPath[0]-2 ; und bis zum vorletzten Element
    $sNowPath &= $aNowPath[$x]&"\" ; wieder zusammengesetzt. (siehe console)
    ConsoleWrite($sNowPath&@CRLF)
    Next
    If Not FileExists($sNowPath&"2010") Then DirCreate($sNowPath&"2010") ; Selbsterklärend
    ConsoleWrite("+> Erstellt: "&$sNowPath&"2010"&@CRLF&@CRLF)
    $sNowPath = "" ; $sNowPath wieder "leeren" sonst ergibts beim nächsten SChleifendurchlauf zb: "D:/Musik/Music National/Kool Savas/D:/Musik/iTunes/Kool Savas"
    Next

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

    Else
    MsgBox(0,"","nichts gefunden")
    EndIf

    [/autoit]
  • SEuBo

    Nichts gegen deine aufschlussreiche Erklärung !
    Wenn ich seine frage richtig verstanden geht es doch darum das wenn irgendwo ein Verzeichnis den Namen 2009 trägt und er dort ein Verzeichnis 2010 erstellen will!
    Also warum so Kompliziert?

    Spoiler anzeigen
    [autoit]

    #include <_GetFilesFolder_Rekursiv.au3>
    #include <File.au3>
    #include <String.au3>

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

    Local $x = 1, $y = 1, $len, $result, $Verz = '2010'

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

    $array = _GetFilesFolder_Rekursiv('D:\', $x, $y)

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

    For $i = 1 To $array[0]
    $string = StringSplit($array[$i], '\', 1)
    For $n = 1 To UBound($string) - 1
    If $string[$n] = 2009 Then $len = StringLen($array[$i])
    If Not $len = '' Then DirCreate(StringLeft($array[$i], $len - 5) & $Verz)
    Next
    Next

    [/autoit]

    Edit: Noch kürzer u. alles in Variablen wenn-falls gebraucht,( unabhängig)!

    Spoiler anzeigen
    [autoit]

    #include <_GetFilesFolder_Rekursiv.au3>
    #include <File.au3>
    #include <String.au3>

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

    Local $Partition = 'D:\', $x = 1, $y = 1, $GesuchtesVerzeichnis = '2009', $VerzeichnisErstellen = '2010', $WieLangDesGesuchtenVerzeichnis = StringLen($GesuchtesVerzeichnis)

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

    $aRueckgabeArray = _GetFilesFolder_Rekursiv($Partition, $x, $y)

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

    For $i = 1 To $aRueckgabeArray[0]
    $String = StringSplit($aRueckgabeArray[$i], "\")
    If $String[$String[0] - 1] = $GesuchtesVerzeichnis Then DirCreate(StringLeft($aRueckgabeArray[$i], StringLen($aRueckgabeArray[$i]) - $WieLangDesGesuchtenVerzeichnis - 1) & $VerzeichnisErstellen)
    Next

    [/autoit]


    LG Kleiner

    Einmal editiert, zuletzt von kleiner27 (4. Dezember 2009 um 04:47)

  • Sooo, nun hatte ich gestern mal wieder einbisschen Zeit das Script anzupassen. Habe es auch gleich durchlaufen lassen. Bei 9583 Ordnern hat es ne Weile gedauert, aber es lief. Nur ein Problem habe ich nicht bedacht. Manche Ordner haben Leerstellen drin, und da der String nicht in " " gesetzt ist, weiß robocopy damit wenig anzufangen. Wer hat bloss dieses DOS erfunden ;o))

    Also hier mal ein aktuelles Script:

    Spoiler anzeigen

    autoit]#include <_GetFilesFolder_Rekursiv.au3>
    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>
    If FileExists(@ScriptDir&"\robocopy.exe") == 1 Then
    $robocopy = "Robocopy ist vorhanden"
    Else
    $robocopy ="ACHTUNG: Bitte Robocopy in das Scriptverzeichnis kopieren!"
    EndIf

    MsgBox(0,"Robocopy ?",$robocopy)


    $Laufwerk = "W:\"
    $altJahr = "2009"
    $neuJahr = "2010"


    $array=_GetFilesFolder_Rekursiv($Laufwerk, 1, 1)
    DIM $String, $sPfad, $aPfad, $sNowPath, $aNowPath
    For $i = 1 to $array[0]
    $String=StringSplit($array[$i],"\")
    If $String[$String[0]-1] == $altJahr Then
    $sPfad &= $array[$i]&"|"
    EndIf
    Next
    If $sPfad <> "" then
    $aPfad = StringSplit(StringTrimRight($sPfad,1),"|")
    For $i = 1 to $aPfad[0]
    $aNowPath = StringSplit($aPfad[$i],"\")
    For $x = 1 to $aNowPath[0]-2
    $sNowPath &= $aNowPath[$x]&"\"
    Next
    If Not FileExists($sNowPath& $neuJahr) Then _robocopy($sNowPath)
    ;DirCreate($sNowPath&"2010")
    ConsoleWrite($sNowPath& $neuJahr& @CRLF)
    $sNowPath = ""
    Next

    Else
    MsgBox(0,"","nichts gefunden")
    EndIf


    MsgBox(0,"","Script ist komplett durchgelaufen!")


    Func _robocopy($Pfad)
    Run (@ScriptDir&"\robocopy.exe "&$Pfad&$altJahr&" "&$Pfad&$neuJahr&" /E /LEV:3 /ZB /COPY:ATSO /LOG:test.txt")
    EndFunc[/autoit]


    Wie bekomme ich nun hier @ScriptDir&"\robocopy.exe "&$Pfad&$altJahr&" "&$Pfad&$neuJahr&" /E /LEV:3 /ZB /COPY:ATSO /LOG:test.txt" das doppelte " " hin ??

    Vorschläge werden gerne angenommen.

    DANKE

  • Hi,

    such Dir was aus:

    [autoit]


    $Pfad = "c:\test\"
    $altJahr = "2009"
    $neuJahr = "2010"

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

    $cmd1 = @ScriptDir & "\robocopy.exe " & Chr (34) & $Pfad & $altJahr & Chr (34) & " " & Chr (34) & $Pfad & $neuJahr & Chr (34) & _
    " /E /LEV:3 /ZB /COPY:ATSO /LOG:test.txt"
    $cmd2 = @ScriptDir & "\robocopy.exe " & '"' & $Pfad & $altJahr & '"' & " " & '"' & $Pfad & $neuJahr & '"' & _
    " /E /LEV:3 /ZB /COPY:ATSO /LOG:test.txt"

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

    MsgBox (0,"", $cmd1 & @CRLF & $cmd2)

    [/autoit]

    ;-))
    Stefan
    P.S: Viele Wege führen zum Ziel....... :P