Abarbeiten aller Dateien eines Ordners

  • Hallo,

    ich würde gerne alle Dateien eines Ordners durch ein Script abarbeiten lassen.

    Dabei wollte ich zuerst den Ordner wählen, aber mit

    [autoit]

    FileOpen ( "filename", mode )

    [/autoit]

    funktioniert es leider nicht, weil er immer eine Datei erwartet. Gibt es so einen Befehl auch für einen ganzen Ordner? Und evtl. das ganze Recursiv mit allen Unterordnern.

    oh habe ich gerade selber gefunden ... peinlich !

    [autoit]

    FileSelectFolder ( "dialog text", "root dir" [, flag [, "initial dir" [, hwnd]]] )

    [/autoit]

    nur recursiv ist der ordner nicht...

    Dann wollte ich mit

    [autoit]

    _FileListToArray($sPath[, $sFilter = "*"[, $iFlag = 0]])

    [/autoit]

    die Dateienliste in ein Array schreiben und dannach das array abarbeiten. Dabei sollte er auch noch einen Datums Filter geben, der nur neuer Dateien in das Array schreibt. Allerdings gibt es bei $sFilter diese Möglichkeit nicht :( wie könnte ich das am einfachsten lösen.

    wenn jemand sowas in der art schon gemacht hat wäre ich für ein Beispiel Code Schnippsel sehr dankbar.

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    2 Mal editiert, zuletzt von franzp (11. August 2008 um 21:58)

    • Offizieller Beitrag

    Hi,

    vielleicht hilft dir das. Ist nach Größe, aber kann man auch nach Datum umstellen.

    Spoiler anzeigen
    [autoit]

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

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

    ; Variablen
    Global $lines_A
    Global $tempFile = _TempFile("C:\", "jpg_", ".txt", 7)
    Global $fileSize = 300 ; in KByte

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

    Global $folder = FileSelectFolder('Aus welchen Ordner sollen Dateien gelöscht werden?', '\', 6, StringLeft(@ScriptDir, 3))
    If @error Then
    MsgBox(16, 'Error', 'Es wurde kein Ordner ausgwählt', 5)
    Exit (0)
    EndIf

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

    Global $filter = InputBox('Filter', 'Bitte den Filter definieren z.B. jpg : ', 'jpg')

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

    RunWait('"' & @ComSpec & '" /c dir *.' & $filter & ' /S /B > ' & $tempFile, $folder, @SW_HIDE)

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

    If Not _FileReadToArray($tempFile, $lines_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    _ArrayDelete($lines_A, UBound($lines_A))
    _ArrayDisplay($lines_A, "ALLE") ; zur Anzeige der gefundenen Dateien

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

    For $i = UBound($lines_A) - 1 To 1 Step - 1
    If (FileGetSize($lines_A[$i]) / 1024) > $fileSize Then _ArrayDelete($lines_A, $i)
    Next

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

    $lines_A[0] = UBound($lines_A)

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

    _ArrayDisplay($lines_A, "kleiner der Grenze: " & $fileSize) ; zur Anzeige der übrig gebliebenen Dateien

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

    For $i = UBound($lines_A) - 1 To 1 Step - 1
    ;FileDelete($lines_A[$i]
    Next

    [/autoit]

    Mega

  • Das ging aber schnell... das muß ich ersmal ausprobieren. Wenn ich das richtig verstanden habe setzte ich dann statt

    [autoit]

    $filesize = 300

    [/autoit]

    z.B.

    [autoit]

    $date = "YYYY/MM/DD"

    [/autoit]

    und dann tauscht man das

    [autoit]

    FileGetsize

    [/autoit]

    gegen ein

    [autoit]

    _Datediff

    [/autoit]

    Kommando aus...

    Auf die Auslagerung in einem Tempfile bin ich natürlich nicht gekommen! :sleeping:

    Und der Runwait, der dem "dir" befehl die Datei erstellen lässt ist natürlich auch eine Lösung.

    Ich bin nicht so schnell, deswegen muß ich das erstmal in mein Script umsetzen und dann ergeben sich leider bestimmt nicht Fragen...


    Aber vielen vielen Dank erstmal! :thumbup:

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    • Offizieller Beitrag

    Ich war gerade ebenfalls an solch einer Lösung interessiert, deshalb habe ich mal die Funktion _GetFilesFolder_Rekursiv() von BugFix ein wenig angepasst:

    Spoiler anzeigen
    [autoit]


    #include<Array.au3>
    $sPath = 'c:\downloads\' ; der Ordner, der durchsucht werden soll
    $sExt = '.txt' ; Dateiendung der gewünschten Dateien (z.B. alle Txt-Dateien)
    $sDate = '20080101000000' ; Alle Dateien die neuer sind als dieses Datum/Uhrzeit (Format: YYYYMMDDhhmmss)

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

    $array = _GetFilesFolder_Rekursiv($sPath, $sExt, 0, $sDate)

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

    _ArrayDisplay($array)

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [,$sDate=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; optional: $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; optional: $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $sDate gibt nur Dateien/Ordner zurück, die neuer sind als das angegebene Datum
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard); 1 -@CR; 2 -@LF; oder beliebiges Zeichen
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $sDate = -1, $iRetType = 0, $sDelim = '0')
    If StringLen($sDate) <> 14 Then $sDate = @YEAR & @MON & @MDAY & '000000'
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDate, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, 1)
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

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

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $sDate = -1, $Delim = @CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $file.DateLastModified > $sDate Then
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If $Subfolder.DateLastModified > $sDate Then
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    EndIf
    _ShowSubFolders($Subfolder, $Ext, $Dir, $sDate, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

    [/autoit]
  • ähm das ist toll und funktioniert Super! :thumbup:

    Aber entgegen dem "Lerneffekt" habe ich den Ablauf in den den beiden Func´s nicht verstanden. 8|
    Mit dem Array Ergebnis kann ich jetzt jede Datei durch mein Func jagen.

    Es sollen allen Word Dateien bzw. deren Makros eine digitale signatur hinzugefügt werden. Hat das zufällig auch schon jemand gemacht?
    Ich hätte jetzt die Befehle von Autoit ausführen lassen, die ich auch beim manuellen Einfügen der Signatur ausgeführt hätte.

    Oder gibt es dafür auch eine besser alternative?

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Hi,

    @TO: Eines habe ich ganz vergessen. Für solche Suchdinge kann man auch wunderbar den TotalCommander nutzen. Der liefert alles gratis mit.

    Mega


    Aber dann habe ich die Dateinamen und Folder noch nicht in autoit.

    Die Suchfunktion nach Dateityp recursiv und neues als Datum X bekommt man doch sogar mit windows boardmitteln hin.

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • hier jetzt mein "fertiger" Code mit dem ich mir mit eurer Hilfe viel Arbeit gespart habe:

    bestimmt nicht besonders sauber, aber ist eben mein erstes Script.

    Auch wenn es vermutlich niemand (außer mir) brauchen kann.

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.2.12.0
    Author: fpr
    Version: 1.0

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

    Script Function:
    Generiert Signaturen für Inpro Makros

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include<Array.au3>

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

    $sPath = FileSelectFolder("choose Folder", "\") ; der Ordner, der durchsucht werden soll
    $sExt = InputBox("Extension", ".dot", ".dot") ; Dateiendung der gewünschten Dateien (z.B. alle Txt-Dateien)
    $sDate = Inputbox("Alle Dateien die neuer sind als:", "(Format: YYYYMMDDhhmmss)","20080801000000"); Alle Dateien die neuer sind als dieses Datum/Uhrzeit (Format: YYYYMMDDhhmmss)

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

    ; Array mit funktion füllen.
    $array = _GetFilesFolder_Rekursiv($sPath, $sExt, 0, $sDate)

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

    ; Zür Prüfung Array darstellen.
    _ArrayDisplay($array)

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

    Opt("WinWaitDelay",100)
    Opt("WinTitleMatchMode",2)
    Run('D:\Programme\Microsoft Office\OFFICE11\WINWORD.EXE')
    WinWait("Microsoft Word","")
    If Not WinActive("Microsoft Word","") Then WinActivate("Microsoft Word","")
    WinWaitActive("Microsoft Word","")

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

    ; Schleife mit array
    For $i = 1 to Ubound($array) -1
    ; MsgBox(0, 'Ergebnis Splitten', 'Wert Nr.:' & $i & ' = ' & $array[$i])
    sleep(1500)
    send("!df")
    WinWait("Öffnen","")
    If Not WinActive("Öffnen","") Then WinActivate("Öffnen","")
    WinWaitActive("Öffnen","")
    send($array[$i]&"{ENTER}") ; Datei aus array öffnen
    sleep(500)

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

    if winexists ("Sicherheitswarnung") Then
    winwait("Sicherheitswarnung")
    If Not WinActive("Sicherheitswarnung","") Then WinActivate("Sicherheitswarnung","")
    WinWaitActive("Sicherheitswarnung","")
    send("a") ; wenn sicherheitswarnung existiert "a" drücken
    EndIf

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

    WinWait("- Microsoft Word","")
    If Not WinActive("- Microsoft Word","") Then WinActivate("- Microsoft Word","")
    WinWaitActive("- Microsoft Word","")
    sleep(1500)
    Send("{ALTDOWN}{F11}{ALTUP}") ; Visual Basic starten
    WinWait("Microsoft Visual Basic","")
    If Not WinActive("Microsoft Visual Basic","") Then WinActivate("Microsoft Visual Basic","")
    WinWaitActive("Microsoft Visual Basic","")
    Send("!xd") ; Signatur Fenster öffnen
    WinWait("Digitale Signatur","")
    If Not WinActive("Digitale Signatur","") Then WinActivate("Digitale Signatur","")
    WinWaitActive("Digitale Signatur","")
    send("w{END}{ENTER}") ; Signatur wählen
    WinWait("Digitale Signatur","")
    If Not WinActive("Digitale Signatur","") Then WinActivate("Digitale Signatur","")
    WinWaitActive("Digitale Signatur","")
    send("{TAB}{ENTER}") ; Signatur bestätigen
    WinWait("Microsoft Visual Basic","")
    If Not WinActive("Microsoft Visual Basic","") Then WinActivate("Microsoft Visual Basic","")
    WinWaitActive("Microsoft Visual Basic","")
    send("!{F4}") ; Visual Baisc beenden
    WinWait("Microsoft Word","")
    If Not WinActive("Microsoft Word","") Then WinActivate("Microsoft Word","")
    WinWaitActive("Microsoft Word","")
    send("!dcj") ; Datei speichern und mit "j" bestätigen
    sleep(1500)
    if winexists ("Microsoft Office Word") Then
    winwait("Microsoft Office Word")
    If Not WinActive("Microsoft Office Word","") Then WinActivate("Microsoft Office Word","")
    WinWaitActive("Microsoft Office Word","")
    send("{ENTER}")
    EndIf

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

    WinWait("Microsoft Word","") ; warten bis Datei gespeichert und geschlossen.
    If Not WinActive("Microsoft Word","") Then WinActivate("Microsoft Word","")
    WinWaitActive("Microsoft Word","")

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

    Next
    MsgBox(0, 'Ergebnis', 'Es wurden :' & $array[0] & ' Dateien bearbeitet')

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

    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $sDate = -1, $iRetType = 0, $sDelim = '0')
    If StringLen($sDate) <> 14 Then $sDate = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDate, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, 1)
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

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

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $sDate = -1, $Delim = @CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $file.DateLastModified > $sDate Then
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If $Subfolder.DateLastModified > $sDate Then
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    EndIf
    _ShowSubFolders($Subfolder, $Ext, $Dir, $sDate, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

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

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---