Eu tenho um .zip
arquivo e preciso descompactar todo o seu conteúdo usando o Powershell. Estou fazendo isso, mas parece não funcionar:
$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)
}
O que há de errado? O diretório C:\a
ainda está vazio.
powershell
Uli Kunkel
fonte
fonte
Respostas:
Aqui está uma maneira simples de usar o ExtractToDirectory de System.IO.Compression.ZipFile :
Observe que, se a pasta de destino não existir, o ExtractToDirectory a criará. Outras advertências:
Veja também:
fonte
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.
. Tenho o .NET 4.6.2 instalado e verifiquei que o assembly está no GAC, mas não entendi por que estou recebendo esse erro.No PowerShell v5 +, há um comando Expand-Archive (assim como o Compress-Archive) incorporado:
fonte
$PSVersionTable.PSVersion
para determinar qual versão do PowerShell você está executando.OutputPath
foi alterado paraDestinationPath
(referência msdn.microsoft.com/powershell/reference/5.1/… )Expand-Archive -Path .\a.zip -DestinationPath .
No PowerShell v5.1, isso é um pouco diferente em comparação à v5. De acordo com a documentação da Microsoft, ele precisa ter um
-Path
parâmetro para especificar o caminho do arquivo morto.Ou então, este pode ser um caminho real:
Documento Expand-Archive
fonte
Expand-Archive Draft.Zip -DestinationPath C:\Reference
funciona sem problemas. Além disso, não é um caminho real , mas um caminho absoluto .Use o
Expand-Archive
cmdlet com um dos conjuntos de parâmetros:fonte
Ei, está trabalhando para mim ..
fonte
CopyHere
método. Acho que o @OlegKazakov já resolveu o problema. No entanto eu coloquei este link aqui para outros surfistas que pode encontrar este tópico: docs.microsoft.com/en-us/previous-versions/windows/desktop/...Para aqueles que desejam usar Shell.Application.Namespace.Folder.CopyHere () e desejam ocultar barras de progresso durante a cópia ou usar mais opções, a documentação está aqui:
https://docs.microsoft.com/en-us / windows / desktop / shell / copy-folderaqui
Para usar o PowerShell e ocultar as barras de progresso e desativar as confirmações, você pode usar um código como este:
Limitações do uso do Shell.Application nas versões principais do Windows:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
Nas versões do Windows Core , por padrão, o Microsoft-Windows-Server-Shell-Package não está instalado, portanto, o shell.applicaton não funcionará.
Nota : A extração de arquivos dessa maneira levará um longo tempo e pode reduzir a velocidade da interface do Windows
fonte
Usando,
expand-archive
mas criando diretórios automaticamente, nomeados após o archive:fonte
outputPath
como na resposta aceita. Nesta solução (como disse o jpmc26), você sempre criará um novo diretório no diretório atual, portanto é possível definir o diretório atual antes de ligarunzip
Usando:
fonte
$archive
e$archiveFile
no finalForEach
O loop processa cada arquivo ZIP localizado na$filepath
variávelfonte