Freigeben über


Zipping a single file with PowerShell

I recently needed to quickly create a PowerShell script that would create a Zip file from a specified input file.  A quick Bing search found a popular solution on StackOverflow:

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)
}

Unfortunately, this would not work for me.  This script zips everything in a folder, whereas I needed to zip a specific file.  I therefore searched some more and found a combination of three blogs that gave me what I needed:

[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

The three posts that helped were:

I hope this saves someone else some time.