Prior to Windows Server 2016 there wasn’t really an easy built-in way of compressing files into a .zip archive by command line without custom scripts or tools, until now.
Here we take a look at some new cmdlets available in PowerShell 5.0 to allow us to archive contents into .zip files.
Create a new .zip file
With Compress-Archive, we can create a .zip file as shown below.
PS C:\Users\Administrator\Desktop> Compress-Archive -LiteralPath C:\Users\Administrator\Desktop\test.txt -DestinationPath C:\Users\Administrator\Desktop\test
In this example, we are creating test.zip on the desktop which contains the test.txt file which also resides on the desktop. It is important to note that this does not remove the original test.txt file, it leaves it in place and creates a new .zip file which also contains test.txt. There is no need to specify the .zip extension on the output file, this takes place automatically.
Update existing files or add new files
With the -U update flag, we can update existing files as long as they have the same file name. The newer files need to exist outside of the .zip file, if the files in the .zip file are newer they will not be added in. If the file does not yet exist within the .zip file at all, it will be added in.
PS C:\Users\Administrator\Desktop> Compress-Archive -U -LiteralPath C:\Users\Administrator\Desktop\test.txt -DestinationPath C:\Users\Administrator\Desktop\test
Archive an entire folder to a .zip file
It’s not just individual files that we can add, we can also archive an entire folder into our test.zip file as shown below.
PS C:\Users\Administrator\Desktop> Compress-Archive -U -Path C:\Users\Administrator\Desktop\testing\* -DestinationPath C:\Users\Administrator\Desktop\test
This will add everything within the testing folder to the existing test.zip file on the desktop. Note that -LiteralPath has been changed to -Path, as this is needed to make use of wildcards within the path, which is what we are doing here with “*”. We can optionally remove -U if we want to add these files to a new .zip file rather than an existing one.
Modify Compression Level
There’s always a trade off between the level of compression and the time it takes to perform the compression, as a higher level of compression requires more system resources to process which will take longer. This can be adjusted with the -CompressionLevel flag. By default it will make use of --Optimal which is generally fairly decent, however you can optionally change to --Fastest which will be quicker but the end result will typically be larger and use more disk space. Specifying --NoCompression on the other hand will not use any compression and the .zip archive will be the same size as the original contents.
As of March 2016 I have observed what appears to be a bug with Compress-Archive in the current build of PowerShell 5.0. If you try to compress a file larger than approximately 1050mb it will appear to process indefinitely and never complete. Anything lower than 1000mb seems to complete without any problem. I first noticed this when trying to archive 2gb log files, however it never completed successfully. To resolve the problem I simply had the log files rotate at 800mb instead and now they compress correctly.
While compressing content has been fun, at some point you may wish to actually get at the data and use it. To do this you’ll first need to expand the content with the Expand-Archive cmdlet.
Unzip a .zip file
We can extract all contents of a .zip file to a specified directory like so.
PS C:\Users\Administrator\Desktop> Expand-Archive -LiteralPath C:\Users\Administrator\Desktop\test.zip -DestinationPathC:\Users\Administrator\Desktop\testing
In this example, we unzip all contents from the test.zip file on the desktop into the testing directory on the desktop.
Other Windows Operating Systems
PowerShell 5.0 was recently released for Windows Server 2008, 2008 R2, 2012, and 2012 R2, so you can manually install it there as well to make use of Compress-Archive and Expand-Archive cmdlets. Note that the installation will require a system reboot.
In the past compressing files and creating archive files in Windows by command line has been more difficult than it needed to be. Now with PowerShell 5.0 the Compress-Archive and Expand-Archive cmdlets make quick work of these simple tasks.
PowerShell 5.0 is installed by default in Windows Server 2016, currently older server operating systems use older versions however they can be updated as needed to make use of these newer options.