Puede utilizar las funciones de PowerShell para crear archivos ZIP y extraerlos. En PowerShell 5.0 (esta versión de PowerShell se instala de forma predeterminada en Windows 10), un módulo separado Microsoft.PowerShell.Archive está disponible. En versiones anteriores de Windows, puede utilizar el Archivo zip clase de .NET Framework para archivar.

Solo hay dos cmdlets en el módulo Microsoft.PowerShell.Archive (C: Windows System32 WindowsPowerShell v1.0 Modules Microsoft.PowerShell.Archive):

  • Comprimir-Archivar
  • Expandir-Archivar

Get-Command -Module Microsoft.PowerShell.Archive | Format-Table -AutoSize

CommandType Name             Version Source
----------- ----             ------- ------
Function    Compress-Archive 1.0.1.0 Microsoft.PowerShell.Archive
Function    Expand-Archive   1.0.1.0 Microsoft.PowerShell.Archive

Veamos ejemplos del uso de estos cmdlets para crear y extraer archivos ZIP en sus scripts de PowerShell.

PowerShell: cree archivos ZIP con Compress-Archive

El comando Comprimir-Archivar tiene la siguiente sintaxis:

Compress-Archive [-Path] String[] [-DestinationPath] String  [-CompressionLevel String ] [-Update]

  • La Camino El parámetro se utiliza para especificar la ruta a los archivos o carpetas que se archivarán;
  • Ruta de destino - especifica la ruta al archivo ZIP;
  • Nivel de compresión - establece el nivel de compresión (NoCompression, Optimal o Fastest);
  • Actualizar - le permite agregar (actualizar) archivos en un archivo ZIP existente;
  • Fuerza - si ya existe un archivo con el nombre especificado, se sobrescribirá.
Consejo. Opciones de nivel de compresión:

  • Óptimo - optimización por el nivel de compresión;
  • Lo más rápido - optimización por el tiempo necesario;
  • No Compresión - sin ninguna compresión.

La opción NoCompression debe usarse al archivar archivos ya comprimidos (jpg, msi, mp3, etc.) en un solo archivo ZIP. En este caso, Windows no perderá tiempo de CPU comprimiéndolos.

Para comprimir un solo archivo, ejecute:

Compress-Archive -Path "C:LogsWindowsUpdate.log" -DestinationPath C:Archiveupdatelog.zip -CompressionLevel Optimal

Puede comprimir todo el contenido de varias carpetas (incluidos todos los archivos y carpetas anidadas):

Compress-Archive -Path C:Logs,C:Logs2 -DestinationPath C:Archivelogs-all.zip -CompressionLevel Optimal

Para agregar varios archivos o carpetas al archivo, separe sus nombres con comas.

Puede agregar al archivo ZIP solo archivos con una máscara específica. Por ejemplo, el siguiente comando comprimirá solo archivos * .txt.

Compress-Archive -Path C:Logs*.txt -DestinationPath C:Archivelogs-txt.zip –CompressionLevel Fastest

Se pueden usar filtros más complejos con el cmdlet Get-ChildItem. Por ejemplo, la siguiente secuencia de comandos le permitirá encontrar los 10 archivos más grandes con las extensiones * .docx o * .xlsx en el disco y agregarlos al archivo:

Get-ChildItem c:shareITdept -Include *.xlsx –Recurse| sort -descending -property length | select -first 10 |Compress-Archive -DestinationPath C:backupitdeptdocs.zip

Para agregar nuevos archivos a un archivo zip existente, use el Actualizar clave:

Compress-Archive -Path C:Logs,C:logs2 –Update -DestinationPath C:Archivelogs-txt.zip

Insinuación.Debido a que el módulo Microsoft.PowerShell.Archive usa la clase System.IO.Compression.ZipArchive, no puede comprimir un archivo de más de 2 GB (porque hay una limitación de la API subyacente). Al intentar comprimir un archivo más grande, aparecerá un error:

Compress-Archive - Error de transmisión demasiado larga

Exception calling "Write" with "3" argument(s): "Stream was too long."
At  C:Windowssystem32WindowsPowerShellv1.0ModulesMicrosoft.PowerShell.ArchiveMicrosoft.PowerShell.Archive.psm1:805
char:29
+ ...                     $destStream.Write($buffer, 0, $numberOfBytesRead)
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IOException

¿Cómo extraer un archivo ZIP con Expand-Archive?

Puede usar el cmdlet Expand-Archive para descomprimir archivos ZIP. La sintaxis del cmdlet es similar:

Expand-Archive [-Path] String [-DestinationPath] String [-Force]  [-Confirm]

Por ejemplo, para descomprimir el archivo ZIP que creamos anteriormente en la carpeta especificada y sobrescribir los archivos:

Expand-Archive -Path C:archivelogs-all.zip  -DestinationPath c:logs -Force

Cmdlet de PowerShell Expandir-Archivar

Desventajas del módulo Microsoft.PowerShell.Archive:

  • No puede ver el contenido del archivo sin extraerlo;
  • No puede extraer algunos de los archivos del archivo (tendrá que extraer el archivo completo);
  • No puede utilizar otros formatos de archivo, excepto zip;
  • No podrá proteger un archivo ZIP con una contraseña.
En casos más complejos, debe utilizar herramientas de terceros para realizar el archivo en sus scripts de PowerShell. Por ejemplo, 7zip o 7Zip4Powershell módulo.

Puede instalar el módulo 7Zip4Powershell y extraer un archivo zip protegido con contraseña de la siguiente manera:

Install-Module -Name 7Zip4Powershell
Expand-7Zip -ArchiveFileName C:ArchiveLogs.zip -Password "p@ssd0rw" -TargetPath C:ShareLogs

Trabajar con archivos comprimidos con la clase ZipFile de PowerShell

En una versión anterior de Windows (anterior a Windows 10 o Windows Server 2016 con la versión de PowerShell <5.0 (si no puede actualizar la versión de PowerShell), puede usar una clase ZipFile separada (de NET Framework 4.5) para crear archivos zip.

Primero, cargue la clase en su sesión de PowerShell:

Add-Type -AssemblyName "System.IO.Compression.FileSystem"

Para archivar una carpeta, use un script PS como este:

$SourceFolder="C:Logs"
$ZipFileName="C:PSlogs.zip"
[IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)

[IO.Compression.ZipFile]:: Clase CreateFromDirectory .net para crear un archivo zip

Para actualizar el archivo ZIP y establecer la relación de compresión, use el siguiente código de PowerShell:

$addfile = ‘C:tempnew.log’
$compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest
$zip = [System.IO.Compression.ZipFile]::Open($zipFileName, 'update')[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $addfile, (Split-Path $addfile -Leaf), $compressionLevel)
$zip.Dispose()

La $zip.Dispose() El comando se usa para cerrar el archivo zip.

Puede enumerar el contenido del archivo ZIP:

[System.IO.Compression.ZipFile]::OpenRead($zipFileName).Entries.Name

¿Cómo ver el contenido del archivo ZIP con powershell?

O puede mostrar el contenido del archivo zip como una tabla Out-GridView con información adicional (tamaño de los archivos comprimidos / sin comprimir, hora de la última escritura, etc.):

$ZipFileName = "C:PSlogs1.zip"
$Stream = New-Object IO.FileStream($ZipFileName , [IO.FileMode]::Open)
$ZipArchive = New-Object IO.Compression.ZipArchive($Stream)
$ZipArchive.Entries |
Select-Object Name,
@{Name="File Path";Expression={$_.FullName}},
@{Name="Compressed Size (KB)";Expression={"{0:N2}" -f($_.CompressedLength/1kb)}},
@{Name="UnCompressed Size (KB)";Expression={"{0:N2}" -f($_.Length/1kb)}},
@{Name="File Date";Expression={$_.LastWriteTime}} | Out-GridView
$ZipArchive.Dispose()
$Stream.Close()
$Stream.Dispose()

propiedades del archivo en el archivo zip: tamaño comprimido / no comprimido, última hora de escritura

Para extraer el archivo ZIP a la carpeta C: Logs, use los siguientes comandos:

$SourceZipFile="C:PSlogs.zip"
$TargetFolder="C:Logs"
[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)

Recomendado para ti