Descompacte o arquivo com o PowerShell no Server 2012 Core

15

Eu preciso descompactar um arquivo com o PowerShell. A maneira típica que eu vi todos fazerem isso é automatizando o shell com um script.

$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
$destinationFolder = $shellApplication.NameSpace($destination)
$destinationFolder.CopyHere($zipPackage.Items())

Isso não vai funcionar para mim, pois o Server Core não possui um shell, portanto não há um para automatizar. Isso gera um erro E_FAIL COM.

O Powershell não parece capaz de fazê-lo por conta própria e, se eu for de terceiros, tenho que descobrir uma maneira de fazer o script, colocando o utilitário no servidor em primeiro lugar. O 7-Zip foi o meu favorito, mas não parece que eu possa criar um script para o download e a instalação dele. O Sourceforge continua me cuspindo de volta em arquivos HTML.

Como posso script completamente descompactando um arquivo zip no Server 2012 Core?

vcsjones
fonte
O que é necessário para baixar o 7zip do SF? Você não pode instalar / copiar de uma fonte interna?
longneck
@ longneck O script PS que estou produzindo será entregue aos clientes; portanto, o script deve ser totalmente independente. Eu poderia hospedar um utilitário zip, mas isso é outra dor de cabeça que eu não quero (legalese). Eu só estava esperando que houvesse uma simples Cmdlet que poderia fazer isso que ficou Intro-ed em 2012.
vcsjones
Se você está entregando algo aos clientes, por que não criar um arquivo de extração automática?
Zoredache
@ Zoredache Bem, isso parecia mais trabalho inicialmente (nosso sistema de compilação já está construindo ZIPs), eu esperava que fosse apenas "muito rápido".
vcsjones

Respostas:

24

O Server 2012 vem com o Dot.NET 4.5, que possui System.IO.Compression.ZipFile, que possui um método ExtractToDirectory. Você deve poder usar isso no PowerShell.

Aqui está um exemplo.

Primeiro, você precisa carregar a montagem ZipFile:

[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null

Depois extraia o conteúdo

[System.IO.Compression.ZipFile]::ExtractToDirectory($pathToZip, $targetDir)

Editar: se você atualizou para o PowerShell 5 (Windows Management Framework 5.0), finalmente possui os cmdlets nativos:

Expand-Archive $pathToZip $targetDir
Peter Hahndorf
fonte
Eu apenas olhei através do System.IO.Compression e ZipFile não está lá. Existe uma atualização para o 4.5 que a adicione?
Mike
Parece que isso foi introduzido no 4.5, mas não está presente no 4.0. Se você tem 4.5, você deve tê-lo.
Peter Hahndorf
6
Já era hora de haver uma solução nativa para isso.
MDMarra