Komprimieren Sie Dateien in den Ordner zur zip-Datei mit PS
Ich habe die folgenden Skripte komprimieren eines Ordners (alle Dateien im Ordner) in eine zip-Datei:
set-content $zipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
$ZipFile = (new-object -com shell.application).NameSpace($zipFileName)
Get-ChildItem $folder | foreach {$zipFile.CopyHere($_.fullname)}
wobei $Ordner = "C:\Test" und $zipFileName = "C:\data\test.zip" als Beispiel
Es funktioniert gut, wenn "C:\Test" enthält keine leeren sub-Ordner, und es scheint funktioniert rekursiv komprimieren Sie alle Dateien in Unterordnern. Ich wirklich wie über einfache Online-Skript. Zum Beispiel:
C:\Test
file1.dat
file2.dat
Test-Sub
File21.bat
....
Allerdings bekam ich Fehler in einem Fall. Ich finde, dass es hier keine leeren Ordner, wie "C:\Test\EmptySub",
C:\Test
file1.dat
file2.dat
Test-Sub
File21.bat
....
EmptySub
AnotherSub
file31.sp1
...
wird das script einen Fehler erzeugen. Ich habe versucht, die folgenden scripts:
Get-ChildItem $files -Recurse | foreach { if (!$_.PSIsContainer)
{$zipFile.CopyHere($_.fullname)}}
Dieser funktioniert nicht wie erwartet. Es ist einfach überspringt alle sub-Ordner. Nicht sicher, ob es filter oder-Klausel zur Verfügung zu überspringen, alle leeren Unterordner?
Aktualisiert: Basierend auf schlägt, probierte ich es aus. Mein problem hat sich nicht aufgelöst werden. Hier ist das update von meiner Frage. Zuerst habe ich aktualisiert, die Scripte vor, um zu zeigen, wie $zipFile-Objekt erzeugt. Zweitens habe ich die vorgeschlagenen codes:
Get-ChildItem $files | ? { -not ($_.PSIsContainer -eq $True -and
$_.GetFiles().Count -eq 0) } | % {$zipfile.CopyHere($_.fullname)}
Habe ich versucht über updates auf meinem Windows XP, es funktioniert mit leeren Unterordner. Aber die gleichen codes nicht workin in Windows-2003-Server. Im folgenden ist die Fehlermeldung:
[Window Title]
Zip-komprimierte Ordner-Fehler
[Inhalt]
Datei nicht gefunden oder keine Leseberechtigung.
[OK]
Nicht sicher, ob dieser Typ PK-Objekt funktioniert in Windows-2003-server, oder wenn es andere Einstellungen für das Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erkennen, leere Verzeichnisse, die durch das testen gegen eine leere Rückgabe von get-childitem. Zum Beispiel, Sie erhalten dann die Liste der leeren Verzeichnisse
Obwohl in Ihrem Fall, Sie wollen die inverse:
Dein code arbeitet rekursiv in dem Sinne, dass Sie jegliche Art von Kind Element (Ordner enthalten). Wenn Ihre Absicht ist, um auszuschließen, leere Ordner sollten Sie die filter:
Versuchen Sie, diese one-liner:
Hier ist die Funktion, die ich erstellt, um zip-Dateien. Der Grund, warum Sie immer die Lesen Fehler ist, da .CopyHere ist eine asynchrone Kopiervorgang, also mein Skript überprüft, ob die Datei vorhanden ist in der zip-Datei, bevor Sie fortfahren, um zur nächsten Datei zu zip: