I recently came across a need to zip up some files prior to copying them over the network. Normally, I’d simply use another tool such as WinZip or 7zip, but I thought I’d like to see how PowerShell could handle it.
There are many tools out there to help you with this (7zip cli, PowerShell community extensions, etc). They’re not included with Powershell, so I decided to try and make use of the tools we have at hand.
I decided to go with a quick way to zip up files by leveraging .NET and using the cmdlet Add-Type
Zipping files with PowerShell
Note: This requires .NET 4.5 and Powershell 3+
This example script is pretty straightforward and simple. It makes use of the System.IO.Compression.Zipfile class that was included with .NET 4.5. We make use of the PowerShell cmdlet Add-Type to add a Microsoft .NET Framework type to the PowerShell session. This allows to leverage .NET in our PowerShell scripts.
############################################################################# # # -SourceFolder = The folder with the files you intend to zip # -DestinationFile = The zip file that you intend to create # -Compression = The type of compression you'd like to use: # Optimal (default option) # Fastest # NoCompression # -IncludeParentDir = Setting this option will include the parent directory # ############################################################################# $SourceFolder = "C:\temp\Zip This Folder" $DestinationFile = "C:\temp\NewZip.zip" $Compression = "Optimal" # Optimal, Fastest, NoCompression Zip-Directory -DestinationFileName $DestinationFile ` -SourceDirectory $SourceFolder ` -CompressionLevel $Compression ` #Optional parameter -IncludeParentDir #Optional parameter function Zip-Directory { Param( [Parameter(Mandatory=$True)][string]$DestinationFileName, [Parameter(Mandatory=$True)][string]$SourceDirectory, [Parameter(Mandatory=$False)][string]$CompressionLevel = "Optimal", [Parameter(Mandatory=$False)][switch]$IncludeParentDir ) Add-Type -AssemblyName System.IO.Compression.FileSystem $CompressionLevel = [System.IO.Compression.CompressionLevel]::$CompressionLevel [System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectory, $DestinationFileName, $CompressionLevel, $IncludeParentDir) } #############################################################################