¿Cómo comprimir / descomprimir archivos en Powershell?

Respuestas:

21

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

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

Buscar en Google "zip powershell" o "descomprimir powershell" también podría arrojar resultados útiles.

Kevin Kuphal
fuente
El artículo vinculado +1 tiene tareas útiles, a diferencia de la respuesta más votada
Ruben Bartelink,
55
-1 por sugerir una búsqueda en Google. Este es el principal resultado de StackExchange en una búsqueda en Google de "descomprimir powershell"
máquina que anhela el
154

Así es como puedes hacerlo solo 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())
Ameer Deen
fuente
26
use $ destination.Copyhere ($ zip_file.items (), 0x10) para sobrescribir los archivos existentes. 0x4 oculta el cuadro de diálogo y 0x14 combina estos y sobrescribe y oculta el cuadro de diálogo.
Peter
3
La línea $destination.Copyhere($zip_file.items())hace el descompresión real.
Jonathan Allen
2
Puede convertir lo anterior en una función, si lo desea: 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 el
66
Esta debería ser la respuesta aceptada.
tugberk
2
Esto me falla cuando el archivo zip contiene solo una carpeta (los elementos están vacíos)
James Woolfenden
56

Ahora en .NET Framework 4.5, hay una clase ZipFile que puede usar así:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)
mousio
fuente
1
Esto sería genial si hubiera un método simple para ExtractToDirectory y una opción para sobrescribir todos los archivos existentes.
James Dunne
1
Esto funciona con .NET 4.5. Sin embargo, también necesita Powershell V3.
DalSoft
3
Cargue el ensamblaje con Add-Type, por ejemplo: Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike
2
@JamesDunne: si no tiene otros archivos que necesita preservar, podría usar 'Remove-Item -Recurse $ TargetFolder'. De lo contrario, se puede hacer lo que quiere, pero no sería trivial. Debería abrir el archivo zip para leerlo, y luego recorrerlo, eliminar cualquier objeto de destino anterior y desempaquetar el nuevo. Por suerte para mí, la solución fácil funciona. ;)
Mike
3
Tenga en cuenta que las ubicaciones de archivos relativas utilizarán el directorio actual de .NET , no el de PowerShell. Ver aquí . Probablemente sea mejor solo con (Resolve-Path $someDir).Pathlos argumentos.
jpmc26
18

Es posible que desee consultar The PowerShell Community Extensions (PSCX), que tiene cmdlets específicamente para esto.

Kevin Colby
fuente
1
+1 PSCX es un gran conjunto de cmdlets complementarios: solo desearía poder elegir y elegir más cuáles quiero y cuáles no. Parece estar cambiando mucho en mi ejemplo Powershell ....
marc_s
Me he encontrado con esto porque realmente quiero automatizar la instalación de PSCX si puedo para algunos compañeros de trabajo. Intentándolo ahora para ver qué tipo de problemas me encuentro
jcolebrand
16

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

PowerShell 5, actualmente disponible en Windows 10 o a través de Windows Management Framework 5 Production Preview , viene con dos cmdlets integrados para 'comprimir' y 'descomprimir':

Windos
fuente
3
Es bueno proporcionar nueva información a viejas preguntas. ;) +1
jpmc26
5

Encuentro la solución más simple para usar solo los binarios de infozip que he usado durante años y usar 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/

Brian Reiter
fuente
5

También me gusta Info-ZIP (el motor Zip que se encuentra en la mayoría de las otras utilidades Zip) y 7-Zip , otro favorito que tiene una utilidad Zip GUI y de línea de comando. 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 utilidades de línea de comandos que no se crearon teniendo en cuenta PowerShell:

  • Ejecutando un ejecutable que comienza con un número en el nombre, prefacio 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" "/ parámetro2" "/ parámetro2" "Valor del parámetro2" "Valor2` "con una comilla"

Prueba esto:

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

O incluso:

zip filename.zip (Get-Content ListOfFiles.txt)
Nathan Hartley
fuente
2

James Holwell Me gusta tu respuesta pero la amplié un poco

# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
    $shell = new-object -com shell.application
    if (!(Test-Path "$sourcePath\$fileName"))
    {
        throw "$sourcePath\$fileName does not exist" 
    }
    New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
    $shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items()) 
}
Nico
fuente
0

WinRAR puede funcionar en modo CMD aceptando argumentos

adopilot
fuente
0

Creé un módulo compatible con PowerShell 2.0 que utiliza los comandos nativos del sistema operativo Windows para comprimir y descomprimir archivos de forma síncrona. Esto funciona en sistemas operativos más antiguos, como Windows XP, y no requiere .Net 4.5 ni ninguna otra herramienta externa. Las funciones también bloquearán la ejecución del script hasta que todos los archivos hayan sido comprimidos / descomprimidos. Puede encontrar más información y el módulo en mi blog aquí .

perro mortal
fuente