Ordner aus einem Pfad ausfiltern und isolieren (batch umsetzung vorhanden)

  • Hallo inferior,

    ich habe dort auch noch einmal editiert:

    Spoiler anzeigen
    [autoit]

    _FolderToZip("C:\Programme\AutoIt3\Deutsche Hilfe\")

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

    func _FolderToZip($spath)
    ;einziger Parameter der Pfad zu dem Ordner der gepackt werden soll mit abschliessenden \
    $s_a_ToZip = _FileListToArray($sPath,"*")
    for $i = 1 to $s_a_ToZip[0]
    $s_a_ToZip[$i] = $sPath & $s_a_ToZip[$i]
    Next
    _BuildInZIP(StringTrimRight($sPath,1) & ".ZIP",$s_a_ToZip,False,1) ;func von BugFix aufrufen
    EndFunc

    [/autoit]


    Oder poste doch einfach einmal das aktuelle komplette Skript (ich habe den Thread nicht von Anfang an gelesen), dann baue ich dir das noch ein,

    mfg (Auto)Bert

  • autoBert
    also erst mal muss ich sagen, danke das du dich hier so beteiligst!
    ich weiß jetzt worin der fehler liegt.

    ich muss mein script in dem ordner starten in dem nicht nur die 7z.exe ist, sonder auch diese 7z.dll

    dann funktioniert alles ordentlich. wirklich klasse!
    eine möglichkeit ungebunden von den hilfs-dateien zu sein wird es warscheinlich nicht geben oder?

    2 Mal editiert, zuletzt von Inferior (11. Juni 2010 um 00:14)

    • Offizieller Beitrag

    Doch, AutoBert hat recht. Die Funktion von BugFix kann auch ganze Verzeichnisse packen. Da habe ich mich geirrt (Sorry, BugFix).

    Ich habe die Funktion mal in mein Beispiel eingebunden:

    Spoiler anzeigen
    [autoit]


    #include <File.au3>

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

    $sPath = 'c:\beispiel\test\'
    $sFile1 = 'datei1.txt'
    $sFile2 = 'datei2.txt'
    $aDirs = _FileListToArray($sPath, '*', 2) ; das Array $aDirs enthält die Namen der Unterverzeichnisse von $sPath
    If Not @error Then
    For $i = 1 To $aDirs[0] ; alle gefundenen Unterverzeichnisse durchgehen
    If FileExists($sPath & $aDirs[$i] & '\' & $sFile1) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile1, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
    If FileExists($sPath & $aDirs[$i] & '\' & $sFile2) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile2, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
    If FileExists(@TempDir & '\' & $aDirs[$i]) Then _BuildInZIP(@TempDir & '\' & $aDirs[$i] & '.zip', @TempDir & '\' & $aDirs[$i] & '\')
    Next
    EndIf

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

    ;===============================================================================
    ; Function Name: _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=True, $iIndexBase=1, $fOverwrite=True)
    ; Description: Erstellt aus einer Datei od. einem Array von Dateien eine ZIP-Datei
    ; mit Hilfe der Windows eigenen ZIP-Funktion
    ; Parameter(s): $sPath Pfad der zu erstellenden ZIP-Datei // Bestehenden ZIP-Datei
    ; $s_a_ToZip String der Einzeldatei oder Array der zu zippenden Dateien
    ; // Pfad des Zielordners, in den entpackt werden soll
    ; $fUnZip=True Entpacken=True, Packen=False (Standard)
    ; $iIndexBase Index Basis (erstes Element mit Pfad) des übergebenen Arrays (0 od.1)
    ; $fOverwrite Falls $sPath existiert ==> Überschreiben (Standard=True)
    ; Return Value(s): Erfolg 1
    ; Fehler set @error 1 - Überschreiben aus, aber Zieldatei existiert
    ; 2 - Zieldatei endet nicht auf ".zip"
    ; 3 - zu komprimierende Datei existiert nicht
    ; @extended: Anzahl der fehlenden Dateien
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=False, $iIndexBase=1, $fOverwrite=True)
    Local $fh, $sNul = '', $sZIPHeader, $objShell = ObjCreate("Shell.Application"), $objZipOrdner, $err = 0
    $sPath = FileGetLongName($sPath, 1)
    If $fUnZip Then
    Local $temp, $objZip
    If Not FileExists($s_a_ToZip) Then DirCreate($s_a_ToZip)
    $temp = $objShell.Namespace($s_a_ToZip)
    $objZip = $objShell.Namespace($sPath)
    $temp.CopyHere($objZip.Items)
    Return 1
    EndIf
    If (Not $fOverwrite) And FileExists($sPath) Then Return SetError(1,0,0)
    If StringRight($sPath, 4) <> '.zip' Then Return SetError(2,0,0)
    For $i = 1 To 18
    $sNul &= Chr(0)
    Next
    $sZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & $sNul
    $fh = FileOpen($sPath, 10)
    FileWrite($fh, $sZIPHeader)
    FileClose($fh)
    $objZipOrdner = $objShell.Namespace($sPath)
    If Not IsArray($s_a_ToZip) Then
    If Not FileExists($s_a_ToZip) Then Return SetError(3,1,0)
    $objZipOrdner.CopyHere($s_a_ToZip)
    Sleep(1000)
    Return 1
    EndIf
    For $i = $iIndexBase To UBound($s_a_ToZip) -1
    If Not FileExists($s_a_ToZip[$i]) Then
    $err += 1
    ContinueLoop
    EndIf
    $objZipOrdner.CopyHere($s_a_ToZip[$i])
    Sleep(1000)
    Next
    If $err Then Return SetError(3,$err,0)
    Return 1
    EndFunc ;==>_BuildInZIP

    [/autoit]


    So brauchst Du dann auch die 7z.dll und 7z.exe nicht mehr.

  • ich hab dein script angepasst
    funktioniert bestens!

    gefällt mir sehr gut :)
    vielen vielen dank dafür!

  • hmm mir stellt sich die frage:

    wenn die gezippten dateien im temp-ordner liegen
    wie kann ich diese den wieder weiterverarbeiten?
    also ich brauch ja den genauen datei-pfad

    also: @DempDir & dateiname (der ja mal der ordnername des unbekannten teilpdades war & ".zip"
    was muss ich für den ordnername verwenden? normal ist es doch $aDirs oder?
    aber das geht nicht..
    steh gerade bisschen auf dem schlauch..

    • Offizieller Beitrag

    Was willst Du denn mit den Archiven machen?
    Das Array $aDirs enthält alle Unterordner von 'c:\beispiel\test\'. Kopiert und gepackt werden aber nur die, die auch die zwei Textdateien enthalten. Demzufolge könnte es sein, dass es einige Archive mit $aDirs[x] nicht gibt.
    Je nachdem, was Du vorhast, würde es sich vielleicht anbieten, die ZIP-Archive in ein eigenes Array einlesen zu lassen.

  • also dieses script soll ein automatisches backup machen, ohne das ich lässtig die einzelnen dateien gerauspicken muss
    das zippen ist um platz zu sparen.
    ok ich glaub ich hab das mit dem array verstanden.
    ich hab das ganze jetzt schon so geändert, dass die zip-dateien in einem extra ordner sind. also in @TempDir & "\Backup\"

    man müsste also nur noch alle pfade
    alle *.zip-dateien in dem ordner herausfinden und in eine variable speichern

    wäre das möglich?

  • 2 Mal editiert, zuletzt von Inferior (11. Juni 2010 um 20:05)

    • Offizieller Beitrag

    Das ist keine normale Variable, sondern ein Array. Ich habe es Dir mal etwas anschaulicher dargestellt:

    [autoit]


    #include <File.au3>
    #include <Array.au3>
    $aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
    For $i = 1 To $aFiles[0]
    $aFiles[$i] = @TempDir & "\Backup\" & $aFiles[$i]
    Next
    _ArrayDisplay($aFiles)

    [/autoit]
  • Spoiler anzeigen

    ==> Subscript used with non-Array variable.:
    For $i = 1 To $aFiles[0]
    For $i = 1 To $aFiles^ ERROR
    >Exit code: 1 Time: 0.215

  • ändere so ab:

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>

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

    $aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
    if IsArray($aFiles) Then
    For $i = 1 To $aFiles[0]
    $aFiles[$i] = @TempDir & "\Backup\" & $aFiles[$i]
    Next
    _ArrayDisplay($aFiles)
    Else
    MsgBox(0,"Information","keine ZIPs gefunden")
    EndIf

    [/autoit]

    der Fehler tritt auf wenn keine ZIP-Files in @TempDir\Backup gefunden werden,

    Edit: zu langsam

    mfg (Auto)Bert

  • Wie wärs mit der Zip32 UDF?
    Die funktioniert echt gut und die nehm ich auch immer...

    Dateien

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • also in diesem array befinden sich nun meine datei-pfade zu dem zip´s..
    aber wie kann ich denn nun das hier einbinden?
    ich weiß jetzt immer noch nicht wie ich die einzellnen pfade angeben kann..


    [autoit]

    #include <ftp.au3>

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

    $server = "servername"
    $username = "username"
    $pass = "xyz"

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

    $Open = _FTPOpen('MyFTP Control')
    $Conn = _FTPConnect($Open, $server, $username, $pass)
    $Ftpp = _FtpPutFile($Conn, >>>>>>>>>zip-dateien<<<<<<<<<<")
    $Ftpc = _FTPClose($Open)

    [/autoit]
  • Hallo inferior,

    ich habe mich bis jetzt nur theoretisch mit FTP auseinandergesetzt, würde es aber so lösen:

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    ;#Include <Array.au3>
    #include <ftp.au3>

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

    $server = "servername"
    $username = "username"
    $pass = "xyz"

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

    $Open = _FTPOpen('MyFTP Control')
    $Conn = _FTPConnect($Open, $server, $username, $pass)
    $aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
    if IsArray($aFiles) Then
    For $i = 1 To $aFiles[0]
    $aFiles[$i] = StringReplace(@TempDir & "\Backup\" & $aFiles[$i],"\","/") ;evtl. unnötig/schädlich
    ConsoleWrite($aFiles[$i] & " wird tarnsferiert" & @CRLF)
    $Ftpp = _FtpPutFile($Conn, $aFiles[$i])
    Next
    ;_ArrayDisplay($aFiles)
    Else
    MsgBox(0,"Information","keine ZIPs gefunden")
    EndIf
    $Ftpc = _FTPClose($Open)

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

    ich habe selbst aber keine Möglichkeit dies zu testen,

    mfg (Auto)Bert

  • also einen fehler hab ich darin entdeckt und zwar muss man bei $Ftpp = _FtpPutFile ein zielverueichnis und auch ein einen entgültigen dateinamen auf dem server angeben.
    macht man dahinter nichts wie du, oder nur ," " dann funktioniert es nicht
    hab das mal mit normalen pfade probiert

    also sollte es

    [autoit]


    $Ftpp = _FtpPutFile($Conn, $aFiles[$i], "/Backup/" & $aFiles[$i])

    [/autoit]

    heißen. was aber auch nicht funktioniert ?(

    EDIT: kann es auch nicht: denn $aFiles[$i] kann ich ja nicht für dem server verwenden, da dies ja der komplette datei-pfad ist

    EDIT²: der fehler liegt andauern an der zeile wo mit hilfe von PUT die zip-dateien übertragen werden sollen.

    Code
    ==> Incorrect number of parameters in function call.:
    $Ftpp = _FtpPutFile($Conn, $aFiles[$i])
    $Ftpp = ^ ERROR
    >Exit code: 1	Time: 0.611

    kann es sein das die ftp file keine array´s oder sonstige unaufgelöste pfade zulässt?
    werd das nochmal testen

    wäre schön wenn das jemand wüsste

    EDIT³:

    in patch ist das ganze ja auch möglich
    da hätte ich das so gelöst:


    2 Mal editiert, zuletzt von Inferior (11. Juni 2010 um 22:14)

  • Hallo inferior,

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    ;#Include <Array.au3>
    #include <ftp.au3>

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

    $server = "servername"
    $username = "username"
    $pass = "xyz"

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

    $Open = _FTPOpen('MyFTP Control')
    $Conn = _FTPConnect($Open, $server, $username, $pass)
    $aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
    if IsArray($aFiles) Then
    For $i = 1 To $aFiles[0]
    $Source = @TempDir & "\Backup\" & $aFiles[$i]
    $Dest = "ServerPfad/" & $aFiles[$i] ;hier anpassen
    ConsoleWrite($Source & " wird nach " & $Dest & "kopiert" & @CRLF)
    $Ftpp = _FtpPutFile($Conn, $Source,$Dest)
    Next
    ;_ArrayDisplay($aFiles)
    Else
    MsgBox(0,"Information","keine ZIPs gefunden")
    EndIf
    $Ftpc = _FTPClose($Open)

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

    die Logik stimmt, der Serverpfad muss auf jedenfallangepasst werden, der Sourcepath stimmt, ich selber habe auf meinem System noch nicht einmal die ftp.au3 und auch keine Hilfe dazu, ändere also evtl die Überschrift in Post #1, damit sich FTP-Spezialisten angesprochen fühlen

    mfg (Auto)Bert