Pregunta ¿Cómo comprimir / descomprimir archivos en Powershell?


¿Hay una sola línea que comprimirá / descomprimirá archivos (* .zip) en PowerShell?


103
2018-06-03 15:57


origen


relacionado: Descomprimir con PS en Server Core - Ruben Bartelink


Respuestas:


DotNetZip te permitirá hacer esto desde PowerShell. No es de una sola línea, pero la biblioteca le permitirá escribir el script de PowerShell que necesita.

También puede utilizar la interfaz COM, ver Comprimir archivos con Windows PowerShell y luego empaquetar un gadget de barra lateral de Windows Vista.

En Google "zip powershell" o "descomprimir powershell" también pueden aparecer resultados útiles.


21
2018-06-03 16:02



+1 artículo vinculado tiene tareas útiles, a diferencia de la respuesta más votada - Ruben Bartelink
-1 por sugerir una búsqueda en Google. Este es el resultado principal de StackExchange en una búsqueda de Google para "descomprimir PowerShell" - machine yearning


Así es como puede hacerlo puramente desde Powershell sin herramientas externas. Esto descomprime un archivo llamado test.zip en el directorio de trabajo actual:

$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())

154
2017-11-14 01:36



use $ destination.Copyhere ($ zip_file.items (), 0x10) para sobrescribir los archivos existentes. 0x4 oculta el cuadro de diálogo, y 0x14 combina estos, sobrescribe y oculta el cuadro de diálogo. - Peter
La línea $destination.Copyhere($zip_file.items()) hace la descompresión real. - Jonathan Allen
Puedes parcelar lo anterior en una función, si quieres: function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) } - James Holwell
Esta debería ser la respuesta aceptada. - tugberk
Esto me falla cuando el archivo zip solo contiene una carpeta (los elementos están vacíos) - James Woolfenden


Ahora en .NET Framework 4.5, hay un Archivo zip clase que puedes usar así:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

56
2017-12-30 17:46



Eso seguro trabajado - lo usé para extraer más de 400 archivos zip. Verificaré que no tenga 4.5 aquí, pero no aparece en Microsoft.NET. - GalacticCowboy
Esta haría Sería genial si hubiera un método simple para ExtractToDirectory y una opción para sobrescribir todos los archivos existentes. - James Dunne
Cargue el ensamblaje con Add-Type, por ejemplo: Add-Type -AssemblyName System.IO.Compression.FileSystem - Mike
@JamesDunne: si no tiene otros archivos que deba conservar, puede usar 'Quitar-Elemento -Consultar $ TargetFolder'. De lo contrario, se puede hacer lo que quiera, pero no sería trivial. Necesitará abrir el archivo zip para leerlo, y luego recorrer el archivo zip, eliminando cualquier objeto de destino anterior y desempaquetando el nuevo. Por suerte para mí, la solución fácil funciona. ;) - Mike
Tenga en cuenta que las ubicaciones relativas de los archivos utilizarán .RED directorio actual, no El PowerShell uno. Ver aquí. Probablemente sea mejor solo para (Resolve-Path $someDir).Path los argumentos. - jpmc26


Es posible que desee revisar Las extensiones de la comunidad PowerShell (PSCX) que tiene cmdlets específicamente para esto.


18
2018-06-03 15:59



+1 PSCX es un gran conjunto de cmdlets adicionales. Solo deseo poder elegir y elegir los que quiero y los que no. Parece que está cambiando mucho en mi caso Powershell ... - marc_s
He encontrado esto porque realmente quiero automatizar la instalación de PSCX si puedo para algunos compañeros de trabajo. Probando ahora para ver qué tipo de problemas me encuentro - jcolebrand


Sé que esta es una pregunta muy antigua, pero acabo de verla vinculada en Twitter en la que figuraba que publicaría una respuesta actual.

PowerShell 5, actualmente disponible en Windows 10 o a través de Vista previa de la producción de Windows Management Framework 5, viene con dos cmdlets incorporados para "comprimir" y "descomprimir":


14
2017-10-17 20:59



Es un bueno cosa para proporcionar nueva información a las viejas preguntas. ;) +1 - jpmc26


Encuentro la solución más sencilla para usar los binarios de infozip que he usado durante años y uso en un entorno UNIX.

PS> zip -9r ../test.zip * 
PS> cd .. 
PS> unzip -t test.zip Archive:  test.zip
    testing: LinqRepository/          OK
    testing: LinqRepository/ApplicationService.cs   OK
    testing: LinqRepository/bin/      OK 
... 
No errors detected in compressed data of test.zip.

Sería sencillo colocar un envoltorio de PowerShell alrededor de la salida de texto, pero en la práctica nunca lo necesito, así que no me he molestado.

http://www.info-zip.org/


5
2017-08-03 19:40





también me gusta Info-ZIP (el motor Zip se encuentra en la mayoría de las otras utilidades Zip) y 7-Zip, otro favorito que tiene una GUI y una utilidad de línea de comandos Zip. El punto es que hay algunas buenas utilidades de línea de comandos que funcionarán para la mayoría de las tareas de PowerShell.

Existen algunos trucos para ejecutar las utilidades de línea de comandos que no se crearon pensando en PowerShell:

  • Ejecutar un ejecutable que comienza con un número en el nombre, prólogo con un Ampersand (&).

    & 7zip.exe

  • Envuelva cada token, la utilidad espera ver desde la línea de comandos, entre comillas.

    & "c: \ ruta con espacio \ SomeCommand.exe" "/ Parameter2" "/ Parameter2" "Parámetro2 Valor" "Valor2` "con una cotización"

Prueba esto:

zip filename.zip (Get-ChildItem somepath\*)

O incluso:

zip filename.zip (Get-Content ListOfFiles.txt)

5
2017-08-11 15:07