Ich habe eine .zip
Datei und muss den gesamten Inhalt mit Powershell entpacken. Ich mache das, aber es scheint nicht zu funktionieren:
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("C:\a.zip")
MkDir("C:\a")
foreach ($item in $zip.items()) {
$shell.Namespace("C:\a").CopyHere($item)
}
Was ist los mit dir? Das Verzeichnis C:\a
ist noch leer.
powershell
Uli Kunkel
quelle
quelle
Antworten:
Hier ist eine einfache Möglichkeit, ExtractToDirectory aus System.IO.Compression.ZipFile zu verwenden :
Beachten Sie, dass ExtractToDirectory den Zielordner erstellt, wenn er nicht vorhanden ist. Weitere Einschränkungen:
Siehe auch:
quelle
Exception calling "ExtractToDirectory" with "2" argument(s): "End of Central Directory record could not be found." At line:5 char:5 + [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $ou ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : InvalidDataException
Add-Type : Cannot add type. The assembly 'System.IO.Compression.FileSystem' could not be found.
. Ich habe .NET 4.6.2 installiert und habe überprüft, ob sich die Assembly im GAC befindet, aber ich habe nicht herausgefunden, warum ich diesen Fehler erhalte.In PowerShell v5 + ist ein Befehl zum Erweitern des Archivs (sowie zum Komprimieren des Archivs) integriert:
quelle
$PSVersionTable.PSVersion
Sie diese Option , um zu bestimmen, welche Version von PowerShell Sie ausführen.OutputPath
inDestinationPath
(Referenz msdn.microsoft.com/powershell/reference/5.1/… ) geändert wurdeExpand-Archive -Path .\a.zip -DestinationPath .
In PowerShell v5.1 unterscheidet sich dies geringfügig von v5. Gemäß der MS-Dokumentation muss ein
-Path
Parameter vorhanden sein, um den Pfad der Archivdatei anzugeben.Oder dies kann ein tatsächlicher Weg sein:
Expand-Archive Doc
quelle
Expand-Archive Draft.Zip -DestinationPath C:\Reference
ohne Probleme. Außerdem ist es kein tatsächlicher Pfad, sondern ein absoluter Pfad.Verwenden Sie das
Expand-Archive
Cmdlet mit einem der folgenden Parametersätze:quelle
Hey, es funktioniert für mich.
quelle
CopyHere
Methode . Ich denke, @OlegKazakov hat sein Problem bereits gelöst. Trotzdem habe ich diesen Link hier für andere Surfer gesetzt, die dieses Thema finden können: docs.microsoft.com/en-us/previous-versions/windows/desktop/…Für diejenigen, die Shell.Application.Namespace.Folder.CopyHere () verwenden und Fortschrittsbalken beim Kopieren ausblenden oder weitere Optionen verwenden möchten, finden Sie hier die Dokumentation:
https://docs.microsoft.com/en-us / windows / desktop / shell / folder-copyhere
Um Powershell zu verwenden und Fortschrittsbalken auszublenden und Bestätigungen zu deaktivieren, können Sie folgenden Code verwenden:
Einschränkungen der Verwendung von Shell.Application unter Windows Core-Versionen:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
In Windows Core- Versionen ist das Microsoft-Windows-Server-Shell-Paket standardmäßig nicht installiert, sodass shell.applicaton nicht funktioniert.
Hinweis : Das Extrahieren von Archiven auf diese Weise dauert lange und kann die Windows-Benutzeroberfläche verlangsamen
quelle
Verwenden von
expand-archive
Verzeichnissen, die nach dem Archiv benannt sind, aber automatisch erstellt werden:quelle
outputPath
wie in der akzeptierten Antwort hinzuzufügen . In dieser Lösung (wie jpmc26 sagte) erstellen Sie immer ein neues Verzeichnis im aktuellen Verzeichnis, so dass Sie möglicherweise das aktuelle Verzeichnis festlegen müssen, bevor Sie anrufenunzip
Verwenden von:
quelle
$archive
und$archiveFile
am EndeForEach
Loop verarbeitet jede ZIP-Datei innerhalb der$filepath
Variablenquelle