Descomprima el archivo con Powershell en Server 2012 Core

15

Necesito descomprimir un archivo con powershell. La forma típica en que he visto a todos hacer esto es automatizando el shell con un script.

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

Esto no va a funcionar para mí, ya que Server Core no tiene un shell, por lo que no hay uno para automatizar. Esto da un error COM E_FAIL.

Powershell no parece poder hacerlo por sí solo, y si voy a una tercera parte, tengo que encontrar una forma de script para que la utilidad llegue al servidor en primer lugar. 7-Zip fue mi opción, pero no parece que pueda hacer un script para descargarlo e instalarlo. Sourceforge sigue escupiéndome archivos HTML.

¿Cómo puedo script completamente descomprimir un archivo zip en Server 2012 Core?

vcsjones
fuente
¿Qué pasa con el requisito de descargar 7zip desde SF? ¿Wy no puede instalar / copiar desde una fuente interna?
Longneck
@longneck El script de PS que estoy produciendo se entregará a los clientes; entonces el guión tiene que ser completamente autónomo. Yo podía anfitrión de una utilidad de compresión de nosotros mismos, pero eso es otro dolor de cabeza que no quiero (jerga legal). Solo esperaba que hubiera un Cmdlet simple que pudiera hacer esto que se
introdujo
Si está entregando algo a los clientes, ¿por qué no construir un archivo autoextraíble?
Zoredache el
@Zoredache Bueno, eso parecía más trabajo inicialmente (nuestro sistema de construcción ya está construyendo ZIP), esperaba que fuera "muy rápido".
vcsjones

Respuestas:

24

Server 2012 viene con Dot.NET 4.5 que tiene System.IO.Compression.ZipFile que tiene un método ExtractToDirectory. Debería poder usar esto desde PowerShell.

Aquí hay un ejemplo.

Primero debe cargar el ensamblaje en el que se encuentra ZipFile:

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

Luego extrae el contenido

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

Editar: si ha actualizado a PowerShell 5 (Windows Management Framework 5.0), finalmente tiene cmdlets nativos:

Expand-Archive $pathToZip $targetDir
Peter Hahndorf
fuente
Acabo de mirar System.IO.Compression y ZipFile no está allí. ¿Hay una actualización a 4.5 que lo agrega?
Mike
Parece que esto se introdujo en 4.5, pero no está presente en 4.0. Si tienes 4.5 deberías tenerlo.
Peter Hahndorf
66
Ya es hora de que haya una solución nativa para esto.
MDMarra
Publicación de