Dateiversion eines Verzeichnisses & Unterverzeichnissen auslesen

  • Hallo zusammen

    Ich suche ein Script, kann aber auch Batch, VB. ein Tool etc sein, damit ich nicht von Pfoten 1000 Dateien durchforsten muss.

    Hat das schonmal jemand gemacht?

    *fragendschau*

    Surfy

    Einmal editiert, zuletzt von Surfy (9. Februar 2012 um 13:23)

  • Hat das schonmal jemand gemacht?


    Bisher nicht, aber hier ist die Basis für dein Skript:

    Spoiler anzeigen
    [autoit]

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

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

    $sPath = @ScriptDir

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

    Global $hFile = FileOpen(@ScriptDir & "\FileVersions.txt", 2) ; 1 = anhängen 2 = überschreiben

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

    Do
    $sPath = FileSelectFolder("Bitte Ordner für den die FileVersionen ermittelt werden sollen auswählen", "::{20D04FE0 - 3AEA - 1069 - A2D8 - 08002B30309D}", 2, $sPath)
    Until Not @error

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

    $aTmp = _RecursiveFileListToArray($sPath, '', 1, 1)
    Dim $aFiles[UBound($aTmp)][2]
    for $i = 0 to UBound($aTmp) -1
    $aFiles[$i][0] = $aTmp[$i]
    $aFiles[$i][1] = FileGetVersion ($aTmp[$i],"FileVersion")
    Next

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

    _ArrayDisplay($aFiles)
    ;for $i = 0 to UBound($aFiles)

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

    ;===============================================================================
    ; Description:: gibt Verzeichnisse und/oder Dateien (rekursiv) zurück, die
    ; einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
    Local $hSearch, $sFile, $sReturn = ''
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Or $hSearch = -1 Then Return SetError(0, 0, $sReturn)
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc ;==>_RecursiveFileListToArray

    [/autoit]

    mfg autoBert

  • Wow, danke Dir!

    Läuft sowas von sauber :D

    Einziges goodie wäre noch, wenn man mit sortierbare Columnen, nach Datei Versionen sortieren könnte, aber das wäre dann auch wirklich nur noch ein goodie ;) Was aber anscheinend gar nicht so einfach ist? Die Suche war zu "Arraydisplay sortierbar" - nicht gerade hilfreich...

    Nochmals Danke, Surfy

  • Moin, ne geht einfach schau mal in der Hilfe nach

    [autoit]

    _ArraySort()

    [/autoit]


    dass sortiert dir ein Array wie du es haben möchtest, als Paramter 2 übergibst du die Richtung (A-Z oder Z-A, bzw Zahlen gehen glaube ich auch)

    Gruß Marvin

  • Hallo Surfy,

    Einziges goodie wäre noch, wenn man mit sortierbare Columnen, nach Datei Versionen sortieren könnte, aber das wäre dann auch wirklich nur noch ein goodie ;) Was aber anscheinend gar nicht so einfach ist? Die Suche war zu "Arraydisplay sortierbar" - nicht gerade hilfreich...

    Da müsstest du dir ein eigenes ArrayDisplay schreiben. Ich denke du suchst so etwas:

    Spoiler anzeigen
    [autoit]

    ; *** Start added by AutoIt3Wrapper ***
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    ; *** End added by AutoIt3Wrapper ***
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; *** Start added by AutoIt3Wrapper ***
    #include <GUIConstantsEx.au3>
    ; *** End added by AutoIt3Wrapper ***
    #include <Array.au3>
    #include <File.au3>
    #include <GuiListView.au3>

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

    $sPath = @ScriptDir

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

    Do
    $sPath = FileSelectFolder("Bitte Ordner für den die FileVersionen ermittelt werden sollen auswählen", "::{20D04FE0 - 3AEA - 1069 - A2D8 - 08002B30309D}", 2, $sPath)
    Until Not @error

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

    $aTmp = _RecursiveFileListToArray($sPath, '(?i).*exe', 1, 1)
    ;_ArrayDisplay($aTmp)

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

    $Gui = GUICreate("", 1024, 600)
    $hListview = GUICtrlCreateListView("Datei-Name|Version|erstellt am|letzte Änderung", 5, 5, 1014, 590, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER))
    For $i = 0 To UBound($aTmp) - 1
    $sFileVer = FileGetVersion($aTmp[$i], "FileVersion")
    ;If $sFileVer <> "" Then
    $aDate = FileGetTime($aTmp[$i], 1, 0)
    If IsArray($aDate) Then
    $tCreated = $aDate[0] & "/" & $aDate[1] & "/" & $aDate[2]
    Else
    $tCreated = ""
    EndIf
    $aDate = FileGetTime($aTmp[$i], 0, 0)
    If IsArray($aDate) Then
    $tLastChanged = $aDate[0] & "/" & $aDate[1] & "/" & $aDate[2]
    Else
    $tLastChanged = ""
    EndIf
    GUICtrlCreateListViewItem($aTmp[$i] & "|" & $sFileVer & "|" & $tCreated & "|" & $tLastChanged, $hListview)
    ;EndIf
    Next
    _GUICtrlListView_SetColumnWidth($hListview, 0, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($hListview, 1, 80)
    _GUICtrlListView_SetColumnWidth($hListview, 2, 100)
    _GUICtrlListView_SetColumnWidth($hListview, 3, 100)
    _GUICtrlListView_RegisterSortCallBack($hListview)
    GUISetState(@SW_SHOW)

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

    ;GUICtrlSetColor(-1, 0x22C21F)
    ;GUICtrlSetColor(-1, 0xAA0000)

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack($hListview)
    Exit
    Case $hListview
    ; Anstoßen der Callback-Sortierfunktion
    _GUICtrlListView_SortItems($hListview, GUICtrlGetState($hListview))
    EndSwitch
    WEnd

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

    ;===============================================================================
    ; Description:: gibt Verzeichnisse und/oder Dateien (rekursiv) zurück, die
    ; einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
    Local $hSearch, $sFile, $sReturn = ''
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Or $hSearch = -1 Then Return SetError(0, 0, $sReturn)
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc ;==>_RecursiveFileListToArray

    [/autoit]

    falls nur Dateien mit einer Fileversion angezeigt werden sollen einfach die beiden auskommentierten Zeilen wieder zulassen,

    mfg autoBert

  • Danke Dir autoBert, das ist perfekt so! ;)

    Schön, dann hast du ja jetzt eine Lösung, schön wäre es auch wenn du das Thema auf gelöst setzen würdest. Einfach 1. Beitrag bearbeiten, Präfix (nähe Überschrift) auf gelöst setzten und absenden.

    Nun sind noch mehr Kommandos drin, die ich noch nie gelesen habe 8|

    Da kann die Hilfe helfen, dass du diese jetzt nicht nur kennst sndern auch verstehst was sie tun,

    mfg autoBert