Datei in ZIP-Datei einpacken !!!

  • Hallo,
    ich bin hier neu und habe ich auch keine große erfahrung mit AutoIt, aber finde ich ihm Super.

    Meine Problem:
    Ich möchte aus ein Ordner Datei die sind älter als 3 oder 2 Tage verschieben in andere Ordner, dabei sollte ein ZIP Datei erstellen nach Jahr \ Monat (wenn ist nicht da) und rein (in "MonatsZIP" zB. Ordner:2006, ZIP: 02.zip) einfügen. Und wenn ist ZIP-Datei da (zB. 02.zip) sollte ihm nicht überschreiben sonder öffnen und rein Neu Datei einfügen.

    Ich habe kleines script gefunden, die die Datei aus ein Ordner verschiebt nach andere datei gleichzeitig erstelt Odrner mit JJJJ \ MM aber mit ZIP funktion komme ich nicht klar.

    Hat jemand Idee, ich bin sehr dankbar.

    [autoit]


    #include <Date.au3>
    #include <file.au3>

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

    ; ----------------------------------------------------------------------------
    ; Script Start
    ; ----------------------------------------------------------------------------
    $quellpfad = $CmdLine[1]
    $zielpfad = $CmdLine[2]
    $anztage = $CmdLine[3]

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


    $CurrentDirectory = FileChangeDir($quellpfad) ; Changes the current working directory to the one needed

    ; MsgBox(0, "", "Current Working Directory: " & @WORKINGDIR) ; Used for viewing the output of variable

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

    $TodaysDateIs = (@YEAR & "/" & @MON & "/" & @MDAY) ; Sets up the date format for calculation, must use Year, month, day format

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

    ; MsgBox(0, "", "The Date is: " & $TodaysDateIs ) ; Used for viewing the output of variable

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

    ; Shows the filenames of all files in the current directory, note that "." and ".." are returned.
    $search = FileFindFirstFile("*")

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

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

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

    While 1
    $file = FileFindNextFile($search)

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

    If @error Then ExitLoop
    If $file = "." Then ContinueLoop ; Blocks output of the root directory "."
    If $file = ".." Then ContinueLoop ; Blocks output of the current directory ".."
    $FileDate = FileGetTime($file, 0, 0)
    ; MsgBox(0, "File Date is: ", $FileDate)
    ; MsgBox(0, "File Name is: ", $file)

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

    If Not @error then
    $yyyymmdd = $FileDate[0] & "/" & $FileDate[1] & "/" & $FileDate[2]
    $jahr = Stringmid($yyyymmdd,1,4)
    $monat = Stringmid($yyyymmdd,6,2)
    ;MsgBox(0, "Monat:", $monat)
    ;MsgBox(0, "File Date is", $yyyymmdd)
    EndIf

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

    $DateDiffTotal = _DateDiff( 'D',$yyyymmdd,$TodaysDateIs)

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

    If $DateDiffTotal > $anztage Then
    DirCreate($zielpfad & "" & $jahr & "" & $monat)
    FileMove($file, $zielpfad & "" & $jahr & "" & $monat)

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

    EndIf

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

    WEnd

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

    ; Close the search handle
    FileClose($search)

    [/autoit]


    PS....
    Ich starte dieser Script per Batch-Datei:
    echo off
    echo Programm 1
    start /wait C:\1_archiv.exe c:\d\archiv c:\d\sen\archiv 1


    Hab mal die ["CODE"] Tags gesetzt. Zum besseren lesen. Gun-Food
    Hab mal die ["AutoIt] Tage gesetzt. Zum noch besseren lesen. Schließlich hat Gun-Food die eingebaut ;).
    peethebee

    3 Mal editiert, zuletzt von Gun-Food (1. März 2006 um 13:49)

    • Offizieller Beitrag

    Hallo!

    Ich habe leider keine Zeit, den Code jetzt en detail anzuschauen. Aber trotzde zwei Dinge:
    - Bitte Code auch mit ["CODE"]- und ["/CODE"]-Tags (ohne Anführungszeiche) einschließen, dann liest es sich besser.
    - WinRAR und 7-Zip kann man per Kommandozeile steuern und so ZIP-ARchive erzeugen und manipulieren.

    Viel Glück beim Suchen,
    peethebee

    • Offizieller Beitrag

    Also ich zippe in meinen Scripten mit der Commandozeile von WinZip:

    Code
    run("C:\Programme\WinZip\wzzip -rp c:\temp\zieldatei.zip -xc:\temp\zieldatei.zip c:\temp\quelle1.xls c:\temp\quelle2.xls c:\temp\quelle3.xls c:\temp\quelle4.xls")

    Hoffe es hilft.
    Der Parameter -xc schließt eine eventuell vorhandene vom zippen aus.
    Genaue Infos gibt dir die Winzip Seite unter Commandline.

  • was genau soll in dem Zip passieren??

    ich verwende den commandline Zip von https://autoit.de/www.info-zip.com
    der hat einige hochinteressante eingebaute Funktionen dazu.

    (zippen ab Datum usw.)

    man kann auch schoen die Fehlermeldungen abfragen

    rufe das Teil jetzt per autoit auf und uebergebe den Zieldateinamen nach z.B. archiv20060402 (dann ist immer schoen sortiert fuer den normalen Windows-User).

    pruefe vorher ab, ob der Zip (heute) schon gelaufen ist, also eine Zip-Datei mit dem aktuellen Datem bereit existiert.

    vorher evtl. noch einen Loeschlauf ueber Daten, die z.B. > 30 Tage sind.


    hab mir ne Funktion dazu gebastelt.


    ============SCHNIPP===============

    hier mal ein Beispiel meiner selbstgeschriebenen Funktionen:

    #inculde-once
    ; German Toolssammlung fuer autoit 3.0
    ;
    ;
    func _zipmove($sourcedir,$files,$dest)
    ; funktion:
    ; Moven in ein Zip-File (ohne Pfadnamen, nicht rekursiv)
    ; nicht mit Wildcards arbeiten
    ; Return Code:
    ; 0 = OK
    ; 12 = Nothing to do
    ; 15 = Zip konnte nicht erstellt werden
    ; 20 = Quelldateien koennen nicht geloescht werden


    $befehl="zip.exe -m -j " & $dest & " " & $sourcedir & "\" & $files

    $action=runwait($befehl, $sourcedir, @sw_minimize)
    if FileExists($sourcedir & "\" & $files) then
    Return "20"
    else
    Return $action
    EndIf

    EndFunc

    ; #############################################################################

    func _zipmove_error($returncode)


    Select
    Case $returncode = 0
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " ZIP erfolgreich")

    Case $returncode = 12
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Hinweis: keine Daten gefunden")

    Case $returncode = 15
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Fehler: Zipdatei konnte nicht erstellt werden")
    Case $returncode = 20
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Fehler: Quelldateien konnten nicht geloescht werden")
    Case else
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Fehler: Zip-Error " & $returncode)

    EndSelect

    EndFunc

    ; #############################################################################

    func _unzipmove($zipfile,$files,$destdir)

    ; funktion:
    ; Unzip eines Zip-Files (ohne Pfadnamen, nicht rekursiv)
    ; loeschen des Zip-Files bei Erfolg
    ; bereits vorhandene Zieldateien werden ueberschrieben
    ; Zielverzeichnis wird angelegt, falls nicht vorhanden
    ; sollten keine files gefunden werden, wird die zipfile nicht geloescht
    ;
    ; Return Code:
    ; 0 = OK
    ; 2 = unzip nicht erfolgreich
    ; 9 = Zipfile nicht vorhanden
    ; 11 = keine files in der Zipdatei
    ; 20 = zipfile konnte nicht geloescht werden

    $befehl="unzip.exe -jo " & $zipfile & " " & $files & " -d " & $destdir
    ; DEBUGG msgbox(0,"befehl",$befehl)
    $action=runwait($befehl, @TempDir, @sw_minimize)

    if $action=0 then
    ; Quelldatei loeschen
    $removezipfile=FileDelete($zipfile)
    if $removezipfile <> 1 then
    Return "20"
    EndIf
    EndIf
    EndFunc

    ; #############################################################################


    func _unzipmove_error($returncode)


    Select
    Case $returncode = 0
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " unzip erfolgreich")

    Case $returncode = 2
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Fehler: unzip nicht erfolgreich")

    Case $returncode = 9
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Hinweis: Zipdatei nicht gefunden")

    Case $returncode = 11
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Hinweis: keine Dateien zum entpacken in der Zipdate")

    Case $returncode = 20
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Fehler: Zipdatei konnte nicht geloescht werden")


    Case else
    Return (@YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & " Fehler: unzip-Error " & $returncode)

    EndSelect

    EndFunc

    ; #############################################################################

  • nur mal so (und weil ich die neuen smilies so gern benutze) :wrongboard: oder etwa nicht :wrongboard:
    also getreu nach dem motto:
    :wrongboard: oder nicht :wrongboard: das ist hier die frage (syntax geklaut bei shakespeare)

  • also, ich bin echt zu doof dafür oder die zip.exe kann das nicht, was ich vorhabe.
    ich hatte mir gedacht ich nehme die zip.exe und habe die in einem unterordner des skriptordners. ich greife darauf zu und versuche damit eine datei, sagen wir, auf dem desktop in ein anderes verzeichnis zu komprimieren.

    also zum mitschreiben:

    1. Pfad der zip.exe: zip.exe liegt in D:\Skript\ZIPEXE
    2. Quelle: die zu komprimierende datei oder ordner auf dem desktop
    3. Ziel: das verzeichnis in das die ZIP-datei soll ist zum beispiel D:\Test

    ich habe etliche versuche gestartet. das beste ergebnis war mal, dass die zip im ordner D:\Skript\ZIPEXE lag. das war aber unpraktisch, da bei dem, was ich damit vorhabe, die ZIP-Datei nicht noch einmal verschoben werden sollte.

    liegt es an mir oder geht das mit der zip.exe einfach nicht. ich habe die anleitung der zip.exe rauf und runter gelesen, schaffe es aber nicht. kann mir jemand aus der patsche helfen?

    grüße

    chris

    • Offizieller Beitrag

    Hallo,

    Der Aufruf lautet:

    Code
    D:\Skript\ZIPEXE\zip.exe D:\Test\<archivname> <zu_archivierende_Datei(en)>
  • bernd670 :
    Wow, Frühaufsteher. Danke, das hatte ich schon häufiger probiert, ging nie! Dann habe ich es eben mit RunAsSet gemacht, weil ich so schön verzweifelt war. Und siehe da - es ging.

    Ich habe nirgendwo gelesen, dass ich Adminrechte für ZIP.exe brauche. Lässt sich das umgehen?

    edit: oder muss ich, wenn ich will, dass die zip kein Admin-Attribut hat, dieses vom skript entfernen lassen?

    Einmal editiert, zuletzt von unearth (4. August 2007 um 14:51)

    • Offizieller Beitrag

    Hallo,

    Zippen kann normal jeder, allerdings nur Dateien und Verzeichnisse auf die man auch das Zugriffsrecht hat.

  • Oh, stimmt. Habe in meinen Test mit Run einen Parameter falsch gestetzt, der bei RunAsSet korrekt war. Dieser kleine Fehler hat mich ganz schön schwitzen lassen. Vielen Dank noch einmal.

  • Hallo All!

    bin nach wie vor der Fan des zip.exe von info-zip, gibt aber Probleme, wenn der oracle-client in bestimmten Versionen auf dem Rechner ist, da die Herrschaften den auch benutzen (aber in einer älteren Version).
    Etliche schnucklige Sachen funktionieren nur mit zip ab Version 2.3

    Um zu prüfen, ob das Zip-Programm im Suchpfad liegt, hab ich 2 Funktionen gebaut.
    _pruefzip23()
    _pruefzip232()

    hab zwischenzeitlich auch ein Superteil an Hichtech-Archivierungs Version für Produktionsserver, die dynamisch die CPU-Last abfragt, damit die Kiste beim zippen nicht völlig in die Knie geht. (sowas gibts garantiert noch nicht von Winzip)

    Wenn ich im Winter mal wieder mehr Zeit habe, dann stell ich da mal einen ganzen Berg zusammen, denke, daß ist ein wirklich interessantes Thema und das sind die Tools, die es nicht zu kaufen gibt.

    Ist da jemand interessiert dran, das Teil läuft bei mir jeden früh um 4.00 auf dem Produktionsserver und sorgt dafür daß ich am Monatsende statt 50.000 Dateien nur jeweils 2 pro Tag habe.??????


    Gruß aus dem heißen Spessart

    German

    (war heute mit der Lagerung seiner Holzernte 2007 beschäftigt)

    Spoiler anzeigen

    ===========hier Beispiel aus einem Hauptprogramm==========

    [autoit]

    $checkzip=_pruefzip23()
    if $checkzip="2.3" then
    msgbox(0,"externes Programm","zip.exe Version 2.3 dedected",1)
    $zipfound=1
    EndIf

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


    if $zipfound=0 then
    $checkzip=_pruefzip232()
    if $checkzip="2.32" then
    msgbox(0,"externes Programm","zip.exe Version 2.32 dedected",1)
    $zipfound=1
    EndIf
    EndIf

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

    ======================================

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

    ; *************************
    Func _pruefzip23()

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

    $Pfad=EnvGet("Path")

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

    if $Pfad=" " then
    Return 0
    exit
    Endif

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

    $suche=StringSplit($Pfad,";")
    $s=$suche[0]

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

    $i=1
    while $i < $s
    $suchnach=$suche[$i]

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

    $suchzip=$suche[$i] & "\zip.exe"

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

    if FileExists($suchzip) then
    ; msgbox(0,"zip found at", $suchzip)

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

    Dim $StrTempFiles = _TempFile() ; Name für Temp-Datei erzeugen

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

    ; $Befehl=" /C" & $suchzip & Chr(34) & "-v"
    $Befehl=$suchzip & " -h "

    RunWait(@comspec & " /c" & $Befehl & " > " & $StrTempFiles, "", @SW_HIDE)

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

    if fileGetSize($suchzip) > 0 then

    $fhFiles = FileOpen($StrTempFiles,0)
    $line = FileReadLine($fhFiles,3)
    If @error = -1 Then ExitLoop
    $VersInfo=StringMid($line,5,3)

    FileClose($fhFiles)

    FileDelete($StrTempFiles)
    EndIf
    Return $VersInfo
    exitloop
    EndIf

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

    ; msgbox(0,"teil ist",$suche[$i],2)

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

    $i=$i+1

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

    WEnd
    Return 0

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

    EndFunc

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

    ; #############################################################################

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

    Func _pruefzip232()

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

    $Pfad=EnvGet("Path")

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

    if $Pfad=" " then
    Return 0
    exit
    Endif

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

    $suche=StringSplit($Pfad,";")
    $s=$suche[0]

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

    $i=1
    while $i < $s
    $suchnach=$suche[$i]

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

    $suchzip=$suche[$i] & "\zip.exe"

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

    if FileExists($suchzip) then
    ; msgbox(0,"zip found at", $suchzip)

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

    Dim $StrTempFiles = _TempFile() ; Name für Temp-Datei erzeugen

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

    ; $Befehl=" /C" & $suchzip & Chr(34) & "-v"
    $Befehl=$suchzip & " -h "

    RunWait(@comspec & " /c" & $Befehl & " > " & $StrTempFiles, "", @SW_HIDE)

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

    if fileGetSize($suchzip) > 0 then

    $fhFiles = FileOpen($StrTempFiles,0)
    $line = FileReadLine($fhFiles,2)
    If @error = -1 Then ExitLoop
    $VersInfo=StringMid($line,5,4)

    FileClose($fhFiles)

    FileDelete($StrTempFiles)
    EndIf
    Return $VersInfo
    exitloop
    EndIf

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

    ; msgbox(0,"teil ist",$suche[$i],2)

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

    $i=$i+1

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

    WEnd
    Return 0

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

    EndFunc

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

    ; #############################################################################

    [/autoit]

    bernd670: Tags gesetzt!

  • Man kann unter XP (Vista?) auch folgendes ausbauen:

    Spoiler anzeigen
    [autoit]


    $Archiv = "c:\test.zip" ; Name des Archives
    $File = "c:\test.txt" ; Datei die ins Archiv soll

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

    ; Archiv erstellen und Datei reinpacken
    If _ZipCreate($Archiv) Then _ZipAdd($Archiv,$File)

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

    ;===============================================================================
    Func _ZipAdd($zipFile,$addFile)
    Local $oShell, $oDir

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

    $oShell = ObjCreate("Shell.Application")

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

    if IsObj($oShell) Then
    $oDir = $oShell.NameSpace($zipFile)
    $oDir.CopyHere ($addFile)
    sleep (500)
    Return 1
    EndIf

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

    Return 0
    EndFunc

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

    ;===============================================================================
    Func _ZipCreate($zipFile)
    Local $i, $sHeader, $file, $err

    $sHeader = "PK" & Chr(5) & Chr(6)
    For $i =0 to 17
    $sHeader &= Chr(0)
    Next

    $file = FileOpen($zipFile,2)
    $err = FileWrite($file,StringToBinary($sHeader))
    FileClose($file)

    Return $err
    EndFunc

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

    Viele Grüße
    Stilgar

    5 Mal editiert, zuletzt von Stilgar (9. August 2007 um 10:34)