Dateien aus versch. Directorys kopieren

  • Hallo,

    ich habe da mal wieder ein kleines Problemchen und benötige als noch Anfänger ein bisschen Inspiration und Hilfe.

    Hier das Szenario:
    Ich habe ein Windows Ordner Namens "Benutzer" der mehrere Unterordner mit Benutzernamen enthält, die Usershares darstellen.

    Nun muß ich ein Skript entwerfen das mir aus allen Benutzerverzeichnissen
    unter Data (wenn vorhanden) eine bestimmte Datei rauskopiert und in einen Zielordner der genauso heissen soll wie das Usershare aus dem die Datei entnommen wurde kopiert.

    Hat da vielleicht schon jemand ein fertiges Skript wo ich mir mal anschauen könnte oder kann mir jemand auf die Sprünge helfen.

    Spontan fällt mir der Befehl "FileFindFirstFile" ein und eine While Schleife, ich weiss aber noch nicht wie ich die Benutzershares nacheinander durchgehen kann und den Namen pro Ordner (Usershare) rausbekomme.

    Über ne kleine Hilfe würde ich mich super freuen.

    Grüße
    Basler

  • Hallo msp-holzwurm,

    das Prinzip ist mir schon relativ klar, nur von Interesse wäre
    ein Beispiel inkl. Syntax wie ich die benötigten Daten bekomme.

    Trotzdem Danke für den netten Hilfsversuch. :)

    Grüße
    Basler

    • Offizieller Beitrag

    Hi basler,
    ich hab dir mal ne Lösung gebastelt. Brauchst dazu die Beta. Ist getestet und funzt :)

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>
    $source_path = "C:\BENUTZER\"
    $target_path = "C:\CHECK\" ; Speicherzielordner
    $searchstring = "crash" ; z.B. "crash20060905.txt"
    $n = 0 ; Anzahl der kopierten Dateien
    $FolderList=_FileListToArray($source_path, "*",2) ; Flag 2 = nur Ordner
    If (Not IsArray($FolderList)) and (@Error=1) Then
    MsgBox (0,"","Keine Ordner gefunden.")
    Exit
    EndIf
    For $i = 1 To $FolderList[0]
    $FileList = _FileListToArray($source_path & $FolderList[$i])
    If IsArray($FileList) Then
    For $j = 1 To $FileList[0]
    If $FileList[$j] = "Data" Then ; dein gesuchter Unterordner - falls vorhanden
    $DataFileList = _FileListToArray($source_path & $FolderList[$i] & "Data")
    If IsArray($DataFileList) Then
    For $k = 1 to $DataFileList[0]
    If StringInStr($DataFileList[$k], $searchstring) <> 0 Then ; in Dateiname ist $searchstring enthalten
    FileCopy($source_path & $FolderList[$i] & "\" & $FileList[$j] & "\" & $DataFileList[$k], _
    $target_path & $FolderList[$i] & "\" & $DataFileList[$k], 8) ; Flag 8 = Ordner erstellen, falls nicht vorhanden
    $n = $n 1
    EndIf
    Next
    EndIf
    EndIf
    Next
    EndIf
    Next
    If $n > 0 Then
    MsgBox(0,"", "Es wurde(n) " & $n & "Datei(en) kopiert.")
    Else
    MsgBox(0,"", "Es wurden keine Dateien kopiert.")
    EndIf

    [/autoit]

    EDIT - wichtig

    Hier klappt was mit der Darstellung nicht. Meine Backslashes sind alle gelöscht! auch mit editieren werden sie wieder gelöscht!
    Also bei $source_path und $target_path gehören vor und hinter den Ordnernamen Backslash.
    In der Codezeile: " $DataFileList = _FileListToArray($source_path & $FolderList[$i] & "Data") " ist vor dem Ordnernamen "Data" ein Backslash zu setzen.
    In der Codezeile: "FileCopy...." sind jeweils zwischen den: & "" & auch Backslash einzufügen.

    EDIT 2
    Nach viel Bastelei sollte die Darstellung jetzt stimmen. (6 Edits - persönl. Rekord ;) )
    Sicherheitshalber lösche ich das vorige Edit aber nicht.

    Nachsatz: Mit Version 3.2.0.1 brauchst du nicht die Beta hierfür.

    bernd670 : Backslashes wieder reingeschrieben

    letztes (?) ! Edit - #9 :LOL:
    Da durch die Darstellung jetzt einiges von der Funktionalität verloren gegangen ist, hänge ich die Datei mal an.

  • [autoit]


    ; Beispiel fuer basler
    ; vom ausgepowerten German
    ; in F:\benutzer\xxx\index.dat nach e:\basler\xxx\index.dat kopieren
    ; alle anderen Dateien, finger weg
    ; gesuchte Datei index.dat soll nach e:\basler ... kopiert werden
    ; hier im Turobdurchgang geschrieben und kurz getestet
    ; Verzeichnisse mußt Du Dir halt anpassen
    ; das mit den Funktionen spart tierisch arbeit, hab den ganzen Tag mit
    ; autoit programmiert heute

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

    $dirsearch = FileFindFirstFile("F:\benutzer\*")

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

    ; Check if the search was successful
    If $dirsearch = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    While 1
    $file = FileFindNextFile($dirsearch)
    If @error Then ExitLoop
    ; MsgBox(4096, "File:", $file)
    ; prüfen ob gefundene Datei ein Verzeichnis ist
    $checkit=_isdir("F:\benutzer\" & $file)
    if $checkit=1 then
    ;msgbox(0,"huch ein verzeichnis gefunden","XX")
    if FileExists("F:\benutzer\" & $file & "\index.dat") then
    _makesichdir($file)
    msgbox(0,"ich müssenkopieren", "F:\Benutzer\" & $file & "\index.dat")
    FileCopy("F:\Benutzer\" & $file & "\index.dat", "E:\basler\" & $file & "\index.dat",1)
    EndIf

    EndIf

    WEnd

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

    ; Close the search handle
    FileClose($dirsearch)

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

    Func _isdir($DIR)
    ; Returncodes
    ; 0 ist kein Verzeichnis
    ; 1 ist ein Verzeichns

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

    $attrib = FileGetAttrib($DIR)

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

    If StringInStr($attrib, "D") Then
    Return 1
    Else
    Return 0
    EndIf

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

    EndFunc

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

    Func _makesichdir($file)
    if FileExists("E:\basler\" & $file) then
    ; alles klaro
    Else
    DirCreate("E:\basler\" & $file)
    EndIf

    [/autoit]

    bernd670: AutoIt-Tags ergänzt ;)