Netzwerk Verzeichnise auslesen und nach Änderungsdatum abhängig ausgeben

  • Hi zusammen bin relativ neu im Thema Autoit (seit 2 Wochen) und suche nach einer Möglichkeit, mehrere Ordner auf einen Netzlaufwerk durchsuchen zu lassen und das Ergebnis zu filtern. Mit filtern meine ich, es soll sich einstellen lassen z.Bsp. Änderungsdatum der Dateien > 2 Tage her und das Ergebnis sollte dann in einer Textdatei landen.

    Der Grund: Es sollen einfach nachvollzogen werden welche Ordner(mit Unterordnern) vom Inhalt aktualisiert wurden und welche schon länger nicht aktualisiert wurden. Händisch nicht machbar da die Ordner jenseits der 1000 liegen.

    Zusätzlich wäre es noch eine Option aus einer Textdatei, in der nur bestimmte Ordner stehen als zu "scannen" zu markieren (damit die Anzahl der zu kontrollierenden Ordner und somit die Netzwerkbelastung sinkt ... nach dem Motto ich hab "nur" 100 Ordner die mich gerade interessieren und die will ich jetzt auf Aktualität prüfen. (also man legt von Hand eine txt an, in der alle betreffenden Ordner stehen.)


    Bisher hab ich nur mit Automatisierung von Konsolen und Windows befehlen und Windowseinstellungen gearbeitet, deshalb tue ich mich hier etwas schwer. Ein paar Anreize die in die richtige Richtung gehen habe ich auch schon gefunden nur habe ich Probleme bei der Anpassung der Skripte. (hatte bisher noch nichts mit Arrays etc. gemacht.

    [ neu ] Dateien und Ordner/Dateien rekursive auflisten und [ offen ] Dateieigenschaften/Dateiinfo auslesen (speziell PDF)

    Gerade der erste Link ist schon ziemlich gut (Post 7) nur hab ich keinen Schimmer an welcher Stelle man nun ansetzen müsste um Dateiattribute sich anzeigen zu lassen, geschweige den danach zu filtern. Ich hoffe es erbarmt sich jemand und kann mich etwas in die richtige Richtung schupsen.


    danke schon mal mfg Rob

    Einmal editiert, zuletzt von Roho (20. Juni 2013 um 14:47)

  • Danke für die Tipps, kann leider immer nur sporadisch zwischen der eigentlichen Arbeit mich belesen und rumprobieren ^^

    Habe mittlerweile eine Script gefunden was grob schon mal die Sachen einliest und als Variablen abspeichert. Wird morgen mal die anderen Funktionen mir anschauen, Autoit ist einfach so umfangreich als Neuling erschlägt es da einen ^^


    [autoit]

    #include <Array.au3>
    Global $Folder[10]
    InetGet("D:\Folder.txt", 1, 0)
    $file = FileOpen("D:\Folder.txt", 0)
    For $i = 0 To UBound($Folder) - 1
    $Folder[$i] = FileReadLine($file, $i + 1)
    Next
    _ArrayDisplay($Folder)
    FileClose($file)

    [/autoit]

    Denke schon mal ein Schritt in die richtige Richtung, da man damit beliebig die Variablen also die Folder erhöhen kann. Als nächstes werde ich versuchen einen Vergleichs Schleife zu schreiben die überprüft ob die Ordner existieren (muss auch mit abgefangen werden) oder sollte man anders rangehen und gleich die Daten der Ordner auslesen?


    mfg Rob

  • Ich habe mir mal erlaubt dein Script von den kleinen Fehlern zu befreien und es ein wenig "aufzupeppen" ;)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    Global $aFolderList

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

    _FileReadToArray("D:\Folder.txt", $aFolderList) ; Datei in das Array lesen
    If @error Then
    MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf

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

    _ArrayDisplay($aFolderList) ; alle Ordner im Array anzeigen

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

    For $i = 1 To $aFolderList[0] ; alle Ordner im Array durchlaufen
    MsgBox(0, "Ordner Nummer " & $i & " aus Array", $aFolderList[$i], 2)
    Next

    [/autoit]

    LG
    Christoph :)

  • Ui danke

    Versteh ich das richtig das somit es nicht festgelegt werden muss wie viele Pfade in der txt stehen? Das mit den Arrays hab ich noch nicht wirklich verstanden ^^ Man könnte ja nun statt der letzten msgBox Box die Suche in den Ordnern/Pfaden starten, mal schauen ob ich das hinbekomme ;)


    Edit: So schaut mal bitte drüber ob ich nen Denkfehler habe ^^

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstants.au3>
    #include <Date.au3>

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

    Global $aFolderList
    $datum = @YEAR&"-"&@MON&"-"&@MDAY
    $tage = InputBox("Aktualisierungszeitraum", "Bitte maximales Alter der Dateien eingeben ")

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

    _FileReadToArray("D:\Folder.txt", $aFolderList) ; Datei in das Array lesen
    If @error Then
    MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf
    _ArrayDisplay($aFolderList) ; alle Ordner im Array anzeigen
    For $i = 1 To $aFolderList[0] ; alle Ordner im Array durchlaufen
    ;MsgBox(0, "Ordner Nummer " & $i & " aus Array", $aFolderList[$i], 2)

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

    If @error = 1 Then
    MsgBox(4096, "", "AUS")
    Else
    $tage = StringSplit($tage, ".")
    $files = _FileListToArray($aFolderList[$i], 1)
    If IsArray($files) = 1 Then
    For $k = 1 To $files[0]
    $time = FileGetTime($files[$k])
    $datediff = _DateDiff ("D", $time[0]&"/"&$time[1]&"/"&$time[2], $tage[3] & "/" & $tage[2] & "/" & $tage[1])
    If $datediff <= $tage Then
    ;hier müsst nun wieder in eine andere txt geschrieben werden oder? -> Foldername/Datei & letzte Änderung
    EndIf
    Next
    EndIf
    EndIf

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

    Next

    [/autoit]


    EDIT 2 irgendwo ist ein grober Schnitzer es passiert nach Auflistung der Folder nichts mehr (auch keine Fehlermeldung

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstants.au3>
    #include <Date.au3>

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

    Global $aFolderList
    $datum = @YEAR&"-"&@MON&"-"&@MDAY
    $tage = InputBox("Aktualisierungszeitraum", "Bitte maximales Alter der Dateien eingeben ")
    run ("notepad.exe")
    WinWaitActive("Unbenannt - Editor")
    _FileReadToArray("D:\Folder.txt", $aFolderList) ; Datei in das Array lesen
    If @error Then
    MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf
    _ArrayDisplay($aFolderList) ; alle Ordner im Array anzeigen
    For $i = 1 To $aFolderList[0] ; alle Ordner im Array durchlaufen

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

    If @error = 1 Then
    MsgBox(4096, "", "AUS")
    Else
    $tage = StringSplit($tage, ".")
    $files = _FileListToArray($aFolderList[$i], 1)
    If IsArray($files) = 1 Then
    For $k = 1 To $files[0]
    $time = FileGetTime($files[$k])
    $datediff = _DateDiff ("D", $time[0]&"/"&$time[1]&"/"&$time[2], $tage[3] & "/" & $tage[2] & "/" & $tage[1])
    If $datediff <= $tage Then
    winactivate("Unbenannt - Editor")
    send("test") ; nur zum testen ob was passiert ^^ eigentlich dachte ich in diese Richtung: send($aFolderlist[$i] & "-" $time & "{ENTER}")
    EndIf
    Next
    EndIf
    EndIf

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

    Next

    [/autoit]

    Liegt sicherlich an der Verschachtelung :(


    mfg Rob

    3 Mal editiert, zuletzt von Roho (12. Juni 2013 um 08:12)

  • Versteh ich das richtig das somit es nicht festgelegt werden muss wie viele Pfade in der txt stehen? Das mit den Arrays hab ich noch nicht wirklich verstanden Man könnte ja nun statt der letzten msgBox Box die Suche in den Ordnern/Pfaden starten, mal schauen ob ich das hinbekomme

    Absolut richtig ;)
    Ich hab mal drüber geschaut:

    Spoiler anzeigen
    [autoit]

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

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

    Global $aFolderList, $aMaxAge
    $aMaxAge = InputBox("Aktualisierungszeitraum", "Wie viele Tage alt dürfen die Dateien sein?")

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

    _FileReadToArray("D:\Folder.txt", $aFolderList) ; Datei in das Array lesen
    If @error Then
    MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf

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

    _ArrayDisplay($aFolderList) ; alle Ordner im Array anzeigen

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

    For $i = 1 To $aFolderList[0] ; alle Ordner im Array durchlaufen
    $aFiles = _FileListToArray($aFolderList[$i], 1)
    If Not IsArray($aFiles) Then ContinueLoop
    For $k = 1 To $aFiles[0]
    $time = FileGetTime($aFiles[$k])
    $datediff = _DateDiff("D", $time[0] & "/" & $time[1] & "/" & $time[2], $tage[3] & "/" & $tage[2] & "/" & $tage[1])
    If $datediff <= $tage Then
    ;...
    EndIf
    Next
    Next

    [/autoit]

    Hier mal wie ich das ganze angehen würde - gerade wenn es später auch noch um Unterordner geht... ;)

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    Local $FileList = ObjCreate("System.Collections.ArrayList"), $iMaxAge = 7

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

    _LoadFilesToList_Recursive($FileList, "C:\Users\Christoph\Downloads\") ; alle dateien in den angegeben ordnern und deren unterordnern werden gesucht und in $FileList gespeichert
    _LoadFilesToList_Recursive($FileList, "C:\Users\Christoph\Desktop\")
    _LoadFilesToList_Recursive($FileList, "C:\Users\Christoph\Appdata\")

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

    ConsoleWrite("Gefundene Dateien: " & $FileList.Count & @LF)

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

    For $i = 0 To $FileList.Count - 1 ; wir gehen alle dateien durch
    ConsoleWrite($FileList.Item($i) & @LF)
    ; IF File = noch nicht zu alt THEN
    ; $FileList.Remove($i)
    ; $i -= 1
    ;ENDIF
    Next

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

    ConsoleWrite("Zu Alte Dateien: " & $FileList.Count & @LF)

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

    Func _LoadFilesToList_Recursive(ByRef $List, $sDir)
    Local $hSearch, $sFile
    If StringRight($sDir, 1) <> "\" Then $sDir &= "\"
    $hSearch = FileFindFirstFile($sDir & "*")
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    ExitLoop
    ElseIf @extended Then
    _LoadFilesToList_Recursive($List, $sDir & $sFile & "\")
    Else
    $List.add($sDir & $sFile)
    EndIf
    WEnd
    EndFunc ;==>_LoadFilesToList_Recursive

    [/autoit]

    PS: Drück in Scite ab und zu mal Strg & T ;)

    LG
    Christoph :)

  • danke das du mir hilfst ^^ ich kann mich einfach nicht in diese Schleifensache reinversetzen (wann ich welche nehmen muss ... if / for / ifnot usw.)

    Ich werd mir die Sache mal in Ruhe am Wochenende anschauen auf Arbeit ist einfach keine Ruhe ;)

    Ein paar Verständnisfragen:

    $iMaxAge = 7 -> wo benutzte ich das bzw. damit meinst du sicherlich 7 Tage und bei der ausgeklammerten if file...Funktion oder?

    _LoadFilesToList_Recursive($FileList -> 3x ??? warum 3 verschiedene Ordner überschreibt er nicht den ersten Zustand oder kann man somit immer andere Ordner und Files laden?

  • Vielleicht hilft es dir, wenn du dir zumindest ein oder zwei Grundlagen Tutorials anschaust und sie auch durcharbeitest bzw. alles selbst ausprobierst. Dann sind sehr sehr schnell Dinge wie Schleifen kein Problem mehr. Das mit der Variable $MaxAge kannst du ja machen wie du es gerne hättest... ;) Zum Thema _LoadFilesToList_Recursive: Ich habe die Methode so geschrieben, dass der übergebenen Liste ($FileList) alle gefundenen Dateien angeheftet werden. Wenn du wissen willst, was du mit der Liste "$FileList" dann alles anfangen kannst schaust du dir am besten mal den Punkt "Liste" in diesem Beitrag an.

    LG
    Christoph :)

  • mal so der Zwischenstand, nicht das hier gedacht wird ich beschäftige mich nicht damit ^^


    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    Local $FileList = ObjCreate("System.Collections.ArrayList"), $iMaxAge = 7
    _LoadFilesToList_Recursive($FileList, "D:\test") ; alle dateien in den angegeben ordnern und deren unterordnern werden gesucht und in $FileList gespeichert
    ConsoleWrite("Gefundene Dateien: " & $FileList.Count & @LF)
    For $i = 0 To $FileList.Count - 1 ; wir gehen alle dateien durch
    $bearbeitungsdatum = FileGetTime ( $FileList.Item($i), 0, 1 )
    $bearbeitungsdatum = _FileDateString2Calc($bearbeitungsdatum)
    $diff = _DateDiff('D', $bearbeitungsdatum, _NowCalc())
    If $diff > 10 Then
    Consolewrite( $FileList.Item($i) & " ------ Alter in Tagen: " & $diff & @LF )
    Else $filelist.remove[$i]
    EndIf
    Next
    ConsoleWrite("Zu Alte Dateien: " & $FileList.Count & @LF)
    ;Funktion rekursive Dateisuche
    Func _LoadFilesToList_Recursive(ByRef $List, $sDir)
    Local $hSearch, $sFile
    If StringRight($sDir, 1) <> "\" Then $sDir &= "\"
    $hSearch = FileFindFirstFile($sDir & "*")
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    ExitLoop
    ElseIf @extended Then
    _LoadFilesToList_Recursive($List, $sDir & $sFile & "\")
    Else
    $List.add($sDir & $sFile)
    EndIf
    WEnd
    EndFunc ;==>_LoadFilesToList_Recursive

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

    ;Funktion Datumsformatierung
    Func _FileDateString2Calc($filedate)
    Return StringRegExpReplace($filedate, "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})", "$1/$2/$3 $4:$5:$6")
    EndFunc ;==>_FileDateString2Calc

    [/autoit]


    EDIT:

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <file.au3>
    #include <GUIConstants.au3>
    #include <Array.au3>
    $alter = Inputbox("Maximales Alter in Tagen angeben", "Maximales Alter in Tagen angeben:", "10")
    _FileWriteLog("D:\Folder.log", " ---------------------------- "& _NowCalc() & " ---------------------------- " & @CRLF)
    Local $FileList = ObjCreate("System.Collections.ArrayList")
    Local $FolderList = ObjCreate("System.Collections.ArrayList")
    Global $aFolderList
    ;Ordner einlesen welche Pfade/Projekte durchsucht werden sollen
    _FileReadToArray("D:\Folder.txt", $aFolderList) ; Datei in das Array lesen
    If @error Then
    MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf
    For $k = 1 To $aFolderList[0] ; alle Ordner im Array durchlaufen
    _LoadFilesToList_Recursive($FileList, $aFolderlist[$k]) ; alle dateien in den angegeben ordnern und deren unterordnern werden gesucht und in $FileList gespeichert
    ;ConsoleWrite("Gefundene Dateien: " & $FileList.Count & @LF)
    For $i = 0 To $FileList.Count - 1 ; wir gehen alle dateien durch
    $bearbeitungsdatum = FileGetTime ( $FileList.Item($i), 0, 1 )
    $bearbeitungsdatum = _FileDateString2Calc($bearbeitungsdatum)
    $diff = _DateDiff('D', $bearbeitungsdatum, _NowCalc())
    If $diff > $alter Then
    _FileWriteLog("D:\Folder.log", $FileList.Item($i) & " ------ " & $diff & " Tage nicht verändert." & @CRLF )
    EndIf
    Next
    Next
    ;abschließende Leerzeile in der Log
    _FileWriteLog("D:\Folder.log", @CRLF)

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

    ;---------------------------------------------------------------------------------------------------------------
    ; benötigte Funktionen
    ;Funktion rekursive Dateisuche
    Func _LoadFilesToList_Recursive(ByRef $List, $sDir)
    Local $hSearch, $sFile
    If StringRight($sDir, 1) <> "\" Then $sDir &= "\"
    $hSearch = FileFindFirstFile($sDir & "*")
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    ExitLoop
    ElseIf @extended Then
    _LoadFilesToList_Recursive($List, $sDir & $sFile & "\")
    Else
    $List.add($sDir & $sFile)
    EndIf
    WEnd
    EndFunc ;==>_LoadFilesToList_Recursive

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

    ;Funktion Datumsformatierung
    Func _FileDateString2Calc($filedate)
    Return StringRegExpReplace($filedate, "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})", "$1/$2/$3 $4:$5:$6")
    EndFunc ;==>_FileDateString2Calc

    [/autoit]

    Mein derzeitiger Endstand, sollte es mal jemand benötigen, ich werden nur noch etwas "feintuning" machen :) Danke für die Denkanstöße und Hilfen das nächste Projekt wird kommen ^^

    Einmal editiert, zuletzt von Roho (20. Juni 2013 um 14:46)

  • In deiner "Endversion" sind aber noch einige nicht so kleine Fehler... :S Du darfst Scripte nicht einfach ineinader kopieren.
    Zum Beispiel läufst du nach jedem Hinzufügen der Dateien eines Ordners zur Liste, ALLE Dateien ALLER Ordner noch einmal durch. - Das muss ja Ewigkeiten gehen. ^^
    Sei mir nicht böse, aber hier die - hoffentlich - fehlerfreie Version: ;)

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <File.au3>
    Local $FileList = ObjCreate("System.Collections.ArrayList"), $iAlter, $aFolderList, $hLogFile = FileOpen("D:\Folder.log", 1)

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

    $iAlter = InputBox("Maximales Alter in Tagen angeben", "Maximales Alter in Tagen angeben:", "10")
    FileWrite($hLogFile, " ---------------------------- " & _NowCalc() & " ---------------------------- " & @CRLF)

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

    _FileReadToArray("D:\Folder.txt", $aFolderList)
    If @error Then
    MsgBox(16, "Error", "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf

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

    For $k = 1 To $aFolderList[0]
    _LoadFilesToList_Recursive($FileList, $aFolderList[$k])
    Next

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

    For $i = 0 To $FileList.Count - 1
    $sModDate = _FileDateString2Calc(FileGetTime($FileList.Item($i), 0, 1))
    $iDiff = _DateDiff('D', $sModDate, _NowCalc())
    If $iDiff > $iAlter Then
    FileWrite($hLogFile, $FileList.Item($i) & " ------ " & $iDiff & " Tage nicht verändert." & @CRLF)
    EndIf
    Next

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

    FileWrite($hLogFile, @CRLF)
    FileClose($hLogFile)

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

    Func _LoadFilesToList_Recursive(ByRef $List, $sDir)
    Local $hSearch, $sFile
    If StringRight($sDir, 1) <> "\" Then $sDir &= "\"
    $hSearch = FileFindFirstFile($sDir & "*")
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    ExitLoop
    ElseIf @extended Then
    _LoadFilesToList_Recursive($List, $sDir & $sFile & "\")
    Else
    $List.add($sDir & $sFile)
    EndIf
    WEnd
    EndFunc ;==>_LoadFilesToList_Recursive

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

    Func _FileDateString2Calc($filedate)
    Return StringRegExpReplace($filedate, "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})", "$1/$2/$3 $4:$5:$6")
    EndFunc ;==>_FileDateString2Calc

    [/autoit]

    LG
    Christoph :)