none
Compress-Archive + QuellDateien löschen RRS feed

  • Frage

  • Hallo,

    ich würde gern per PowerShell alle Unterverzeichnisse eines definierten Ordners archivieren. Also so zippen, dass die OrginalDateien und Verzeichnisse nur noch im Archiv vorhanden sind. Kennt jemand einen Schalter für "move". Bei winzip war das -m.

    Das zippen funktioniert mit:

    $qVerz = "C:\PS\Test\*"
    $zVerz = "C:\PS\Archiv\"
    Get-ChildItem $qVerz -Directory | %{ Compress-Archive -Path "$($_.Fullname)\*" -DestinationPath "$zVerz$($_.Name)$(get-date -Format _yyyyMMdd).zip" -update}

    mit folgendem Befehl könnte ich die ausgewählten Verzeichnisse im Nachgang löschen:

    Get-ChildItem $qVerz -Directory | Remove-Item -Force -Recurse

    Dabei sehe ich aber das Problem, dass während des Zippens neue Dateien in die Ordner eingefügt werden können die dann beim Renove-Item mit gelöscht werden würden ohne im Archiv zu sein. Das Zippen selbst könnte ja auch auf einen Fehler laufen.....

    Gibt es einen Schalter für "move"?

    Wenn nicht, gibt es eine Möglichkeit zu fragen ob definierte Dateien im Archiv vorhanden sind? Also erste eine Liste aller Dateien erstellen ...

    Get-ChildItem $qVerz -Recurse

    ... und dann nur die löschen, die im Archiv vorhanden sind.

    Danke.

    Gruß.

    ottto1

    Mittwoch, 18. September 2019 16:17

Antworten

  • Ich würde Dir empfehlen, Deinen Code deutlich "sprechender" zu gestallten. Dann ließt er sich einfacher, wie ich finde und läßt falls nötig sich auch nach längerer Zeit noch gut nachvollziehen.

    ... ungefähr so hier:

    $Quelle = 'C:\Ablage\PS\Test'
    $Ziel = 'C:\Ablage\PS\Archiv'
    $OrdnerListe = Get-ChildItem $Quelle -Directory
    $KalenderWoche = [System.Globalization.DateTimeFormatInfo]::CurrentInfo.Calendar.GetWeekOfYear((get-date), 2, 1)
    foreach ($Ordner in $OrdnerListe) {
        $ZielOrdner = Join-Path -Path $Ziel -ChildPath $Ordner.Name
        if ( -not(Test-Path $ZielOrdner) ) {
            New-Item -Path $ZielOrdner -ItemType Directory
        }
        $ZipDateiName = Join-Path -Path $ZielOrdner -ChildPath $($Ordner.Name + $(get-date -Format '_yyyyMMdd') + '_KW' + $KalenderWoche + '.zip' )
        $arguments = "-a -r -p $ZipDateiName $($Ordner.Name)" 
        & "C:\Program Files\WinZip\WZZIP.exe" $arguments
    }
    ... probier ma ... ;-)

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 29. Oktober 2019 15:28

Alle Antworten

  • Variante 1 - Du könntest die gewünschten Dateien in ein temporäres Verzeichnis verschieben, von dort die Komprimierung anschubsen und es dann nach dem Komprimieren komplett löschen.

    Variante 2 - Du könntest 7-Zip benutzen. Das ist kostenlos auch kommerziell nutzbar. Davon gibt es eine "Konsolenversion", die, wenn ich mich nicht irre, auch einen Schalter zum Verschieben ins Archiv hat.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 18. September 2019 16:52
  • Hallo,

    ich hab das jetzt mit dem wzzip vom winzip versucht.

    $qVerz = "C:\Ablage\PS\Test\"
    $zVerz = "C:\Ablage\PS\Archiv\"
    $uVerze = Get-ChildItem "$qVerz\*" -Directory # Liste der Unterverzeichnisse
    $kw = [System.Globalization.DateTimeFormatInfo]::CurrentInfo.Calendar.GetWeekOfYear((get-date),2,1)
    foreach ($i in $uVerze) {
        Write-Host $i
        $verz = "$zVerz$($i.Name)"
        if( !(Test-Path $verz) ) #Erstellt Archivverzeichnis, falls nicht vorhanden.
        {
            New-Item -Path $verz -ItemType Directory
        }
    
        $arguments = "-a", "-r", "-p", "$verz\$($i.Name)$(get-date -Format _yyyyMMdd)_KW$kw.zip", "$i" 
        #$arguments = "-a", "-r", "-p", "-m", "$verz\$($i.Name)$(get-date -Format _yyyyMMdd)_KW$kw.zip", "$i" 
        & "C:\Program Files\WinZip\WZZIP.exe" $arguments
    }
    
    #EOL

    Funktioniert auch soweit. Mich stört jetzt aber noch eine Ausgabe. Bei jedem Aufruf von der WZZIP.EXE bekomme ich folgende Meldung:

    Ist das nur eine Info oder eine Warnung? Wenn ich wzzip in einer DOS-Box ausführe, bekomme ich keine vergleichbare Meldung.

    Danke.

    Gruß.

    ottto

    Dienstag, 29. Oktober 2019 13:52
  • Ich würde Dir empfehlen, Deinen Code deutlich "sprechender" zu gestallten. Dann ließt er sich einfacher, wie ich finde und läßt falls nötig sich auch nach längerer Zeit noch gut nachvollziehen.

    ... ungefähr so hier:

    $Quelle = 'C:\Ablage\PS\Test'
    $Ziel = 'C:\Ablage\PS\Archiv'
    $OrdnerListe = Get-ChildItem $Quelle -Directory
    $KalenderWoche = [System.Globalization.DateTimeFormatInfo]::CurrentInfo.Calendar.GetWeekOfYear((get-date), 2, 1)
    foreach ($Ordner in $OrdnerListe) {
        $ZielOrdner = Join-Path -Path $Ziel -ChildPath $Ordner.Name
        if ( -not(Test-Path $ZielOrdner) ) {
            New-Item -Path $ZielOrdner -ItemType Directory
        }
        $ZipDateiName = Join-Path -Path $ZielOrdner -ChildPath $($Ordner.Name + $(get-date -Format '_yyyyMMdd') + '_KW' + $KalenderWoche + '.zip' )
        $arguments = "-a -r -p $ZipDateiName $($Ordner.Name)" 
        & "C:\Program Files\WinZip\WZZIP.exe" $arguments
    }
    ... probier ma ... ;-)

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 29. Oktober 2019 15:28
  • Hallo BOfH-666,

    ich hab den Code geändert. Sieht gleich viel besser aus .... Danke.

    Funktioniert aber leider noch nicht.

    WZZIP bringt mir:

    "ERROR: missing name of Zip file

    Program is terminating!"

    Zum Testen hab ich eine Kurzfassung erstellt, welche die gleiche Fehlermeldung bringt.

     $arguments = "-a -r -p C:\Ablage\PS\Test\test.zip C:\Ablage\PS\Test" 
     & "C:\Program Files\WinZip\WZZIP.exe" $arguments

    Mit Anführungszeichen funktioniert das Zippen, bringt aber die oben beschriebene rote Meldung.

     $arguments = "-a", "-r", "-p", "C:\Ablage\PS\Test\test.zip", "C:\Ablage\PS\Test"  
     & "C:\Program Files\WinZip\WZZIP.exe" $arguments

    Hast Du noch eine Idee?

    Danke

    Gruß

    ottto


    • Bearbeitet ottto1 Mittwoch, 30. Oktober 2019 10:45
    Mittwoch, 30. Oktober 2019 09:49
  • Probier ma so:
    $FileName = 'C:\Ablage\PS\Test\test.zip'
    $Folder = 'C:\Ablage\PS\Test\'
    & "C:\Program Files\WinZip\WZZIP.EXE" "-a" "-r" "-p" $FileName $Folder


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 30. Oktober 2019 11:02
  • Start-Process -FilePath 'wzzip.exe' -ArgumentList @('-a','-r')


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Mittwoch, 30. Oktober 2019 13:17
  • Probier ma so:
    $FileName = 'C:\Ablage\PS\Test\test.zip'
    $Folder = 'C:\Ablage\PS\Test\'
    & "C:\Program Files\WinZip\WZZIP.EXE" "-a" "-r" "-p" $FileName $Folder


    bringt das gleiche Ergebis. Das Zippen funktioniert und es kommt die oben beschriebene Meldung.

    Die gleiche rote Meldung kommt aber auch, wenn ich bewusst einen Fehler einbaue (nicht existierender Pfad).

    Da kommt dann nur der Hinweis, in weiß, dass es Probleme mit dem Pfad gibt.

    Von daher würde ich die rote Meldung als Hinweis und nicht als Problemmeldung sehen, oder?

    Danke.

    Gruß.

    ottto




    • Bearbeitet ottto1 Montag, 4. November 2019 15:27
    Montag, 4. November 2019 13:12
  • Start-Process -FilePath 'wzzip.exe' -ArgumentList @('-a','-r')


    Gibt es da eine Möglichkeit die Ausgabe und evtl. Fehlerausgabe einzufangen?

    Danke.

    Gruß.

    ottto



    • Bearbeitet ottto1 Montag, 4. November 2019 13:21
    Montag, 4. November 2019 13:19
  • bringt das gleiche Ergebis. Das Zippen funktioniert und es kommt die oben beschriebene Meldung.

    Hmmm ... was soll ich sagen ... bei mir läuft es ohne jegliche Fehlermeldung ...


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Montag, 4. November 2019 20:06
  • hier noch mal im Detail, vielleicht hab ich ja was übersehen...

    $FileName = 'C:\Ablage\PS\test.zip'
    $Folder = 'C:\Ablage\PS\Test\'
    & "C:\Program Files\WinZip\WZZIP.EXE" "-a" "-r" "-p" $FileName $Folder

    Bringt dann das:

     
    PS C:\Ablage\PS> C:\Ablage\PS\t1.ps1
    WinZip(R) Command Line Support Add-On Version 4.0 64-bit (Build 10562)
    Copyright (c) 1991-2013 WinZip International LLC - All Rights Reserved
    WZZIP.EXE : 
    At C:\Ablage\PS\t1.ps1:11 char:1
    + & "C:\Program Files\WinZip\WZZIP.EXE" "-a" "-r" "-p" $FileName $Folde ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:String) [], RemoteException
        + FullyQualifiedErrorId : NativeCommandError
     
    Searching...
    

    Alles ab WZZIP.EXE in rot.

    Danke.

    Gruß.

    ottto

    Dienstag, 5. November 2019 07:33
  • Start-Process -FilePath 'wzzip.exe' -ArgumentList @('-a','-r')


    Gibt es da eine Möglichkeit die Ausgabe und evtl. Fehlerausgabe einzufangen?

    get-help start-process -online

    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Dienstag, 5. November 2019 12:36
  • Hallo zusammen,

    ich hab jetzt noch mal versucht mit der Geschichte weiter zu kommen....

    Das Zippen über Start-Process funktioniert bringt aber auch eine Fehlermeldung.

    $FileName = 'C:\Ablage\PS\test.zip'
    $Folder = 'C:\Ablage\PS\Test\PSTools'
    
    Start-Process -FilePath 'C:\Program Files\WinZip\WZZIP.EXE' -ArgumentList @('-a', '-r', '-p', $FileName, $Folder) -PassThru -RedirectStandardError Err.log -RedirectStandardOutput Out.log
    

    

    Hat noch jemand eine Idee?

    Danke.

    Gruß.

    ottto

    Dienstag, 4. Februar 2020 11:47
  • Hat noch jemand eine Idee?

    Hast Du denn mal versucht, das Ganze auf einer "frischen" Maschine zu testen? Ich konnte Deinen Fehler ja gar nicht nachstellen - vielleicht liegt es ja gar nicht am Script oder an der benutzten Methode!?  ;-)

    Und Du hast auch immernoch die Möglichkeit, das Ganze mit purem Powershell und dem cmdlet Compress-Archive zu erledigen oder einfach die Kommandozeilen-Version von 7-Zip zu benutzen.  ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 4. Februar 2020 15:35
  • Ja, frische Maschine ist im Einsatz. Zwischenzeitlich wurde der Rechner getauscht. Dabei auch von Win7 auf Win10 gewechselt. PowerShell-Version: 5.1.16299.1146 .

    Beim Compress-Archive konnte ich keinen Schalter für "move" finde. Wenn ich das in zwei Schritten mache(erst alles zippen und dann alles löschen), sehe ich die Gefahr, dass Daten gelöscht werden die evtl. noch nicht gezippt wurden, falls beim zippen mal was klemmt.

    Das Script soll auf einem Server laufen. Dort werde ich kein 7-Zip installieren dürfen.

    Dienstag, 4. Februar 2020 17:07
  • Beim Test auf einem WindowsServer2016 bekomme ich den gleichen Fehler.

    PowerShell-Version: 5.1.14393.3053

    Merkwürdig, dass bei Dir der Fehler nicht kommt. Wäre interessant was bei Dir anders ist oder was Du anders machst ...

    Dienstag, 4. Februar 2020 17:24
  • Beim Compress-Archive konnte ich keinen Schalter für "move" finde. Wenn ich das in zwei Schritten mache(erst alles zippen und dann alles löschen), sehe ich die Gefahr, dass Daten gelöscht werden die evtl. noch nicht gezippt wurden, falls beim zippen mal was klemmt.

    Die Lösung dafür wäre die Variante 1 in meiner ersten Antwort ganz oben. ;-)

    Das Script soll auf einem Server laufen. Dort werde ich kein 7-Zip installieren dürfen.

    Warum nicht? Wenn's die Lösung für Dein Problem ist!? Winzip installiert ja offenbar auch auf dem Server.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Bearbeitet BOfH-666 Dienstag, 4. Februar 2020 19:18
    Dienstag, 4. Februar 2020 19:17
  • Ich hab gerade festgestellt, dass die Fehlermeldung auch kommt, wenn ich das wzzip in einer Kommandozeile, mit gleichen Parametern, aufrufe und die Fehlerausgabe in eine Datei umleite. 2>Fehler.log .Somit liegt's nicht an der PS.

    Bei Deiner Variante1 sehe ich, wie schon beschrieben, das Problem, dass Dateien verloren gehen könnten, wenn das zippen nicht sauber durchläuft. Ich werde jetzt mal versuchen ob ich das mit try/catch abfangen kann.

    Danke.

    Gruß.

    ottto

    Mittwoch, 5. Februar 2020 10:57
  • Ich hab gerade festgestellt, dass die Fehlermeldung auch kommt, wenn ich das wzzip in einer Kommandozeile, mit gleichen Parametern, aufrufe und die Fehlerausgabe in eine Datei umleite. 2> Fehler.log .Somit liegt's nicht an der PS.

    Vielleicht gibt's ja ne server-zertifizierte Version von WinZip. Oder ihr nehmt - wie schon mal empfohlen - einfach 7-Zip. Das läuft bei einem Kunden auf einem 2019-er Server ohne Probleme. Nur weils kostenlos ist, heißt es ja nicht, dass es schlechter ist als WinZip. ;-)

    Bei Deiner Variante1 sehe ich, wie schon beschrieben, das Problem, dass Dateien verloren gehen könnten, wenn das zippen nicht sauber durchläuft. Ich werde jetzt mal versuchen ob ich das mit try/catch abfangen kann.

    Fehlerbehandlung ist immer eine sehr gute Idee. Ich versteh nur nicht, warum das aus einem anderen Ordner anders sein soll, als aus dem original Quell-Ordner.

    Nur mal aus Neugier - kannst Du verraten, um was für Daten es dabei geht?


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 5. Februar 2020 12:29
  • Es geht um viele kleine Dateien mit Messwerten die in Zeitscheiben pro Tag oder pro Woche, verdichtet, abgelegt werden sollen. Es kommen ständig neue Dateien dazu.

    zur Erklärung, meine Überlegung:

    1.Das einfachste wäre ein Tool zum Verdichten mit "move"-Schalter, welches die Daten direkt aus dem Quellpfad abholt und im Zielverzeichnis verdichtet ablegt.

    2.Wenn man das in zwei Schritten(erst alles zippen und dann alles löschen) macht, besteht die Gefahr, dass während des Zippens neue Dateien dazukommen, die dann beim zweiten Schritt(alles löschen) mit gelöscht würden, obwohl die noch nicht archiviert wurden.

    3.Um das versehentliche Löschen zu verhindern, könnte man die entsprechenden Dateien (vor den zwei Schritten) in ein tmp-Verzeichnis verschieben. Dort dann alles zippen und im Zielverzeichnis ablegen. Danach dann alle Dateien im tmp-Verzeichnis löschen. Dabei besteht aber die Gefahr, das beim Zippen was schief geht (ZielVerzeichnis nicht vorhanden oder keine Schreibrechte). Das Zippen würde an der Stelle abbrechen, das anschließende Löschen aller Dateien aber durchlaufen.

    Wie schon geschrieben versuche ich gerade eine Lösung mit try/catch.

    Gruß.

    ottto


    • Bearbeitet ottto1 Donnerstag, 6. Februar 2020 15:06
    Donnerstag, 6. Februar 2020 14:14
  • zu 1. 7-Zip

    Zu 2. siehe 3.

    Zu 3. Du solltest natürlich vor dem Löschen der temporär verschobenen Dateien testen, ob alle Dateien im Archiv angekommen sind. Das ist Teil der Fehlerbehandlung und sollte keiner extra Erwähnung bedürfen.  ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 6. Februar 2020 16:10
  • das hört sich gut an ....

    Hast du dazu einen Ansatz?

    Kann man die Namen der enthaltenen Dateien in ein Array schreiben?

    Danke.

    Gruß.ottto


    • Bearbeitet ottto1 Freitag, 7. Februar 2020 09:56
    Freitag, 7. Februar 2020 09:54
  • das hört sich gut an ....

    Hast du dazu einen Ansatz?

    Kann man die Namen der enthaltenen Dateien in ein Array schreiben?

    Das ist jetzt 'n Spaß, oder? Wenn Du etwas in einen Koffer eingepackt hast und bist Dir unsicher, ob Du alles drinn hast - was machst Du dann?  ;-) 

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 7. Februar 2020 09:59
  • Also entpacken. Ein Array mit den Namen der enthaltenen Dateien füllen und dieses dann gegen die zu löschenden prüfen.

    Werde ich  versuchen....

    Danke.

    Gruß.

    ottto

    Freitag, 7. Februar 2020 10:21
  • Wenn Du wirklich wirklich wirklich sicher gehen möchtest, ob die Dateien korrekt wieder originalgetreu aus dem Archiv entpackt werden können, solltest Du die originalen (temporär verschobenen) Dateien mittels deren Hash-Werte mit denen zum Prüfen aus dem Archiv extrahierten Dateien vergleichen.  ;-) 

    Das dazu passende cmdlet wäre dann Get-FileHash.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 7. Februar 2020 10:39