Mam .zip
plik i muszę rozpakować całą jego zawartość za pomocą programu Powershell. Robię to, ale wydaje się, że to nie działa:
$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)
}
Co jest nie tak? Katalog C:\a
jest nadal pusty.
powershell
Uli Kunkel
źródło
źródło
Odpowiedzi:
Oto prosty sposób przy użyciu ExtractToDirectory z System.IO.Compression.ZipFile :
Zauważ, że jeśli folder docelowy nie istnieje, ExtractToDirectory go utworzy. Inne zastrzeżenia:
Zobacz też:
źródło
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.
. Mam zainstalowany program .NET 4.6.2 i sprawdziłem, czy zestaw znajduje się w GAC, ale nie zrozumiałem, dlaczego pojawia się ten błąd.W programie PowerShell v5 + wbudowane jest polecenie Rozwiń-Archiwum (a także Kompresuj-Archiwum):
źródło
$PSVersionTable.PSVersion
do określania używanej wersji programu PowerShell.OutputPath
został zmieniony naDestinationPath
(odniesienie msdn.microsoft.com/powershell/reference/5.1/… )Expand-Archive -Path .\a.zip -DestinationPath .
W PowerShell v5.1 jest to nieco inne w porównaniu do v5. Zgodnie z dokumentacją MS musi mieć
-Path
parametr określający ścieżkę do pliku archiwum.Albo może to być faktyczna ścieżka:
Rozwiń-Archiwum Dokumentów
źródło
Expand-Archive Draft.Zip -DestinationPath C:\Reference
działa bez problemu. Ponadto nie jest to ścieżka rzeczywista , ale ścieżka bezwzględna .Użyj polecenia
Expand-Archive
cmdlet z jednym z zestawu parametrów:źródło
Hej, to działa dla mnie ..
źródło
CopyHere
metodę. Chyba @OlegKazakov już rozwiązał swój problem. Niemniej jednak umieszczam ten link tutaj dla innych internautów, którzy mogą znaleźć ten temat: docs.microsoft.com/en-us/previous-versions/windows/desktop/…Dla tych, którzy chcą korzystać z Shell.Application.Namespace.Folder.CopyHere () i chcą ukryć paski postępu podczas kopiowania lub skorzystać z większej liczby opcji, dokumentacja znajduje się tutaj:
https://docs.microsoft.com/en-us / windows / desktop / shell / folder-copyhere
Aby użyć programu PowerShell i ukryć paski postępu i wyłączyć potwierdzenia, możesz użyć następującego kodu:
Ograniczenia użycia Shell.Application w wersjach systemu Windows:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
W podstawowych wersjach systemu Windows domyślnie pakiet powłoki Microsoft-Windows-Server-Shell nie jest zainstalowany, więc shell.applicaton nie będzie działać.
Uwaga : Wyodrębnianie archiwów w ten sposób zajmie dużo czasu i może spowolnić GUI systemu Windows
źródło
Korzystanie z
expand-archive
automatycznego tworzenia katalogów nazwanych na podstawie archiwum:źródło
outputPath
jak w zaakceptowanej odpowiedzi. W tym rozwiązaniu (jak powiedział jpmc26) zawsze utworzysz nowy katalog w bieżącym katalogu, więc możliwe jest, że musisz ustawić bieżący katalog zanim zadzwoniszunzip
Za pomocą:
źródło
$archive
a$archiveFile
na końcuForEach
Pętla przetwarza każdy plik ZIP znajdujący się w$filepath
zmiennejźródło