Benutzer mit den meisten Antworten
Compress-Archive + QuellDateien löschen

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
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''
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 6. November 2019 14:07
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''
- Bearbeitet BOfH-666 Mittwoch, 18. September 2019 16:53
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Sonntag, 22. September 2019 11:39
- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 23. September 2019 11:33
- Tag als Antwort aufgehoben Denniver ReiningMVP, Moderator Mittwoch, 6. November 2019 14:07
- Nicht als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Mittwoch, 6. November 2019 14:07
-
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
-
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''
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 6. November 2019 14:07
-
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
-
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
-
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
-
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
-
Start-Process -FilePath 'wzzip.exe' -ArgumentList @('-a','-r')
Gibt es da eine Möglichkeit die Ausgabe und evtl. Fehlerausgabe einzufangen?
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
-
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
-
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''
-
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.
-
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
-
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
-
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''
-
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
-
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''
-
das hört sich gut an ....
Hast du dazu einen Ansatz?
Kann man die Namen der enthaltenen Dateien in ein Array schreiben?
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
-
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''