the recognized power not name compress powershell zip
System.IO.Packaging.ZipPackage

recognized - zip file powershell 4



¿Cómo crear un archivo zip con PowerShell? (24)

¿Por qué nadie mira la documentación? Existe un método compatible para crear un archivo zip vacío y agregar archivos individuales integrados en la misma biblioteca .NET 4.5 a la que hacen referencia todos.

Vea a continuación un ejemplo de código:

# Load the .NET assembly Add-Type -Assembly ''System.IO.Compression.FileSystem'' # Must be used for relative file locations with .NET functions instead of Set-Location: [System.IO.Directory]::SetCurrentDirectory(''./Desktop'') # Create the zip file and open it: $z = [System.IO.Compression.ZipFile]::Open(''z.zip'', [System.IO.Compression.ZipArchiveMode]::Create) # Add a compressed file to the zip file: [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($z, ''t.txt'', ''t.txt'') # Close the file $z.Dispose()

Le animo a navegar por la documentación si tiene alguna pregunta.

¿Es posible crear un archivo zip con PowerShell?


¿Qué pasa con System.IO.Packaging.ZipPackage ?

Requeriría .NET 3.0 o mayor.

#Load some assemblys. (No line break!) [System.Reflection.Assembly]::Load("WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35") #Create a zip file named "MyZipFile.zip". (No line break!) $ZipPackage=[System.IO.Packaging.ZipPackage]::Open("C:/MyZipFile.zip", [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite") #The files I want to add to my archive: $files = @("/Penguins.jpg", "/Lighthouse.jpg") #For each file you want to add, we must extract the bytes #and add them to a part of the zip file. ForEach ($file In $files) { $partName=New-Object System.Uri($file, [System.UriKind]"Relative") #Create each part. (No line break!) $part=$ZipPackage.CreatePart($partName, "", [System.IO.Packaging.CompressionOption]"Maximum") $bytes=[System.IO.File]::ReadAllBytes($file) $stream=$part.GetStream() $stream.Write($bytes, 0, $bytes.Length) $stream.Close() } #Close the package when we''re done. $ZipPackage.Close()

a través de here


Aquí está el código de trabajo, comprimir todos los archivos de una carpeta de origen y crear un archivo zip en la carpeta de destino.

$DestZip="C:/Destination/" $Source = "C:/Source/" $folder = Get-Item -Path $Source $ZipTimestamp = Get-Date -format yyyyMMdd-HHmmss; $ZipFileName = $DestZip + "Backup_" + $folder.name + "_" + $ZipTimestamp + ".zip" $Source set-content $ZipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) # Wait for the zip file to be created. while (!(Test-Path -PathType leaf -Path $ZipFileName)) { Start-Sleep -Milliseconds 20 } $ZipFile = (new-object -com shell.application).NameSpace($ZipFileName) Write-Output (">> Waiting Compression : " + $ZipFileName) #BACKUP - COPY $ZipFile.CopyHere($Source) $ZipFileName # ARCHIVE Read-Host "Please Enter.."



Aquí hay una versión ligeramente mejorada de la respuesta de sonjz, agrega una opción de sobrescritura.

function Zip-Files( [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false)] [string] $zipfilename, [Parameter(Position=1, Mandatory=$true, ValueFromPipeline=$false)] [string] $sourcedir, [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$false)] [bool] $overwrite) { Add-Type -Assembly System.IO.Compression.FileSystem $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal if ($overwrite -eq $true ) { if (Test-Path $zipfilename) { Remove-Item $zipfilename } } [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false) }


Aquí un ejemplo completo de línea de comandos para iniciar desde cmd.exe o desde ssh o lo que quieras!

powershell.exe -nologo -noprofile -command "&{ Add-Type -A ''System.IO.Compression.FileSystem'' [System.IO.Compression.ZipFile]::CreateFromDirectory(''c:/path/to/source/folder/'', ''c:/path/to/output/file.zip'');}"

Saludos


Cargar la clase [System.IO.IOException] y usar sus métodos es un paso importante para suprimir los errores no deseados, debido al hecho de que es una clase no nativa de PowerShell, así que espere varios contextos de errores sin ella.

Controlé los errores de mi secuencia de comandos a la T, pero obtuve una gran cantidad de color rojo extra ''existe'' al usar la clase [System.IO.Compression.ZipFile]

function zipFiles( [Parameter(Position=0, Mandatory=$true] [string] $sourceFolder, [Parameter(Position=1, Mandatory=$true] [string]$zipFileName, [Parameter(Position=2, Mandatory=$false] [bool]$overwrite) { Add-Type -Assembly System.IO Add-Type -Assembly System.IO.Compression.FileSystem $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal $directoryTest = (Test-Path $dailyBackupDestFolder) $fileTest = (Test-Path $zipFileName) if ( $directoryTest -eq $false) { New-Item -ItemType Directory -Force -Path $dailyBackupDestFolder } if ( $fileTest -eq $true) { if ($overwrite -eq $true ){Remove-Item $zipFileName} } try { [System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder,$zipFileName,$compressionLevel) } catch [System.IO.IOException] { Write-Output ($dateTime + '' | '' + $_.Exception.Message ) | Out-File $logFile -append -force } }

Lo que estoy haciendo aquí es capturar estos errores de E / S, como acceder a archivos que ya existen, capturar ese error y dirigirlo a un archivo de registro que estoy manteniendo con un programa más grande.


Dando debajo de otra opción. Esto comprimirá una carpeta completa y escribirá el archivo en una ruta determinada con el nombre dado.

Requiere .NET 3 o superior

Add-Type -assembly "system.io.compression.filesystem" $source = ''Source path here'' $destination = "c:/output/dummy.zip" If(Test-path $destination) {Remove-item $destination} [io.compression.zipfile]::CreateFromDirectory($Source, $destination)



En caso de que tengas instalado WinRAR:

function ZipUsingRar([String] $directory, [String] $zipFileName) { Write-Output "Performing operation ""Zip File"" on Target ""Item: $directory Destination:" Write-Output ($zipFileName + """") $pathToWinRar = "c:/Program Files/WinRAR/WinRar.exe"; [Array]$arguments = "a", "-afzip", "-df", "-ep1", "$zipFileName", "$directory"; & $pathToWinRar $arguments; }

El significado de los argumentos: afzip crea un archivo zip, df elimina archivos, ep1 no crea una ruta de directorio completa dentro del archivo


Este script itera todos los directorios y comprime cada uno.

Get-ChildItem -Atributos d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}


Esto es realmente oscuro pero funciona. 7za.exe es una versión independiente de 7zip y está disponible con el paquete de instalación.

# get files to be send $logFiles = Get-ChildItem C:/Logging/*.* -Include *.log | where {$_.Name -match $yesterday} foreach ($logFile in $logFiles) { Write-Host ("Processing " + $logFile.FullName) # compress file & ./7za.exe a -mmt=off ($logFile.FullName + ".7z") $logFile.FullName }


Esto también debería funcionar para comprimir un solo archivo sin usar una carpeta temporal y usar .Net 4.5 nativo, convertido de C # desde esta answer . Utiliza una mejor sintaxis usando la sintaxis de here .

Uso:

ZipFiles -zipFilename output.zip -sourceFile input.sql -filename name.inside.zip.sql

Código:

function ZipFiles([string] $zipFilename, [string] $sourceFile, [string] $filename) { $fullSourceFile = (Get-Item -Path "$sourceFile" -Verbose).FullName $fullZipFile = (Get-Item -Path "$zipFilename" -Verbose).FullName Add-Type -AssemblyName System.IO Add-Type -AssemblyName System.IO.Compression Add-Type -AssemblyName System.IO.Compression.FileSystem Using-Object ($fs = New-Object System.IO.FileStream($fullZipFile, [System.IO.FileMode]::Create)) { Using-Object ($arch = New-Object System.IO.Compression.ZipArchive($fs, [System.IO.Compression.ZipArchiveMode]::Create)) { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($arch, $fullSourceFile, $filename) } } }

Utilizando:

function Using-Object { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [AllowEmptyString()] [AllowEmptyCollection()] [AllowNull()] [Object] $InputObject, [Parameter(Mandatory = $true)] [scriptblock] $ScriptBlock ) try { . $ScriptBlock } finally { if ($null -ne $InputObject -and $InputObject -is [System.IDisposable]) { $InputObject.Dispose() } } }


Instale 7zip (o descargue la versión de línea de comandos en su lugar) y use este método de PowerShell:

function create-7zip([String] $aDirectory, [String] $aZipfile){ [string]$pathToZipExe = "$($Env:ProgramFiles)/7-Zip/7z.exe"; [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r"; & $pathToZipExe $arguments; }

Puedes llamarlo así:

create-7zip "c:/temp/myFolder" "c:/temp/myFolder.zip"


Los comandos de línea de comandos completos en Windows para comprimir y extraer directorio son los siguientes:

  • Para la compresión:

powershell.exe -nologo -noprofile -command "& { Add-Type -A ''System.IO.Compression.FileSystem''; [IO.Compression.ZipFile]::CreateFromDirectory(''C:/Indus'',''C:/Indus.zip''); }"

  • Para la extracción:

powershell.exe -nologo -noprofile -command "& { Add-Type -A ''System.IO.Compression.FileSystem'';[IO.Compression.ZipFile]::ExtractToDirectory(''C:/Indus.zip'',''C:/Indus''); }"


Para la compresión, usaría una biblioteca (7-Zip es bueno como sugiere Michal ).

Si instala 7-Zip , el directorio instalado contendrá 7z.exe que es una aplicación de consola.
Puede invocarlo directamente y usar cualquier opción de compresión que desee.

Si desea participar con la DLL, eso también debería ser posible.
7-Zip es freeware y de código abierto.


PowerShell v5.0 agrega los cmdlets Compress-Archive y Expand-Archive . Las páginas enlazadas tienen ejemplos completos, pero la esencia de esto es:

# Create a zip file with the contents of C:/Stuff/ Compress-Archive -Path C:/Stuff -DestinationPath archive.zip # Add more files to the zip file # (Existing files in the zip file with the same name are replaced) Compress-Archive -Path C:/OtherStuff/*.txt -Update -DestinationPath archive.zip # Extract the zip file to C:/Destination/ Expand-Archive -Path archive.zip -DestinationPath C:/Destination


Si alguien necesita comprimir un solo archivo (y no una carpeta): http://blogs.msdn.com/b/jerrydixon/archive/2014/08/08/zipping-a-single-file-with-powershell.aspx

[CmdletBinding()] Param( [Parameter(Mandatory=$True)] [ValidateScript({Test-Path -Path $_ -PathType Leaf})] [string]$sourceFile, [Parameter(Mandatory=$True)] [ValidateScript({-not(Test-Path -Path $_ -PathType Leaf)})] [string]$destinationFile ) <# .SYNOPSIS Creates a ZIP file that contains the specified innput file. .EXAMPLE FileZipper -sourceFile c:/test/inputfile.txt -destinationFile c:/test/outputFile.zip #> function New-Zip { param([string]$zipfilename) set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $zipfilename).IsReadOnly = $false } function Add-Zip { param([string]$zipfilename) if(-not (test-path($zipfilename))) { set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $zipfilename).IsReadOnly = $false } $shellApplication = new-object -com shell.application $zipPackage = $shellApplication.NameSpace($zipfilename) foreach($file in $input) { $zipPackage.CopyHere($file.FullName) Start-sleep -milliseconds 500 } } dir $sourceFile | Add-Zip $destinationFile


Una alternativa pura de PowerShell que funciona con PowerShell 3 y .NET 4.5 (si puede usarlo):

function ZipFiles( $zipfilename, $sourcedir ) { Add-Type -Assembly System.IO.Compression.FileSystem $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false) }

Simplemente pase la ruta completa al archivo zip que desea crear y la ruta completa al directorio que contiene los archivos que desea comprimir.


Una forma nativa con el último marco .NET 4.5, pero sin características por completo:

Creación:

Add-Type -Assembly "System.IO.Compression.FileSystem" ; [System.IO.Compression.ZipFile]::CreateFromDirectory("c:/your/directory/to/compress", "yourfile.zip") ;

Extracción:

Add-Type -Assembly "System.IO.Compression.FileSystem" ; [System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:/your/destination") ;

Como se mencionó, totalmente sin características, así que no espere una marca de sobrescritura .

ACTUALIZACIÓN: vea a continuación otros desarrolladores que se han expandido a lo largo de los años ...


Utilizo este fragmento de código para revisar la carpeta de copias de seguridad de mi base de datos en busca de archivos de copia de seguridad aún no comprimidos, comprimirlos con 7-Zip y finalmente eliminar los archivos *.bak para ahorrar algo de espacio en el disco. Los archivos de aviso se ordenan por longitud (de menor a mayor) antes de la compresión para evitar que algunos archivos no se compriman.

$bkdir = "E:/BackupsPWS" $7Zip = ''C:/"Program Files"/7-Zip/7z.exe'' get-childitem -path $bkdir | Sort-Object length | where { $_.extension -match ".(bak)" -and -not (test-path ($_.fullname -replace "(bak)", "7z")) } | foreach { $zipfilename = ($_.fullname -replace "bak", "7z") Invoke-Expression "$7Zip a $zipfilename $($_.FullName)" } get-childitem -path $bkdir | where { $_.extension -match ".(bak)" -and (test-path ($_.fullname -replace "(bak)", "7z")) } | foreach { del $_.fullname }

Aquí puede consultar un script de PowerShell para realizar copias de seguridad, comprimir y transferir esos archivos a través de FTP .


Editar dos : este código es un kluge feo, feo de los días anteriores. No lo quieres.

Esto comprime el contenido de ./in ./out.zip to ./out.zip con System.IO.Packaging.ZipPackage siguiendo el ejemplo here

$zipArchive = $pwd.path + "/out.zip" [System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35") $ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive, [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite") $in = gci ./in | select -expand fullName [array]$files = $in -replace "C:","" -replace "//","/" ForEach ($file In $files) { $partName=New-Object System.Uri($file, [System.UriKind]"Relative") $part=$ZipPackage.CreatePart($partName, "application/zip", [System.IO.Packaging.CompressionOption]"Maximum") $bytes=[System.IO.File]::ReadAllBytes($file) $stream=$part.GetStream() $stream.Write($bytes, 0, $bytes.Length) $stream.Close() } $ZipPackage.Close()

Edición: No Unreliable para archivos más grandes, tal vez> 10 mb, YMMV. Something que ver con la evidencia de aplicaciones y almacenamiento aislado. El approach más amigable de .NET 4.5 funciona bien en PS v3, pero quería más memoria en mi caso. Para usar .NET 4 de PS v2, los archivos de configuración necesitan un tweak unsupported .



function Zip-File { param ( [string]$ZipName, [string]$SourceDirectory ) Add-Type -Assembly System.IO.Compression.FileSystem $Compress = [System.IO.Compression.CompressionLevel]::Optimal [System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectory, $ZipName, $Compress, $false) }

Nota:
ZipName: Ruta completa del archivo Zip que desea crear.

SourceDirectory: ruta completa al directorio que contiene los archivos que desea comprimir.