Extract only specified files from a zip archive in PowerShell.
# Ref: https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/extract-specific-files-from-zip-archive
function ExtractFromArchive([string] $Path, [string] $DestinationPath, [string] $Filter)
{
# ensure the output folder exists
$exists = Test-Path -Path $DestinationPath
if ($exists -eq $false)
{
$null = New-Item -Path $DestinationPath -ItemType Directory -Force
}
# load ZIP methods
Add-Type -AssemblyName System.IO.Compression.FileSystem
# open ZIP archive for reading
$zip = [System.IO.Compression.ZipFile]::OpenRead($Path)
# find all files in ZIP that match the filter (i.e. file extension)
$zip.Entries | Where-Object { $_.FullName -like $Filter } | ForEach-Object {
# extract the selected items from the ZIP archive and copy them to the out folder
$fileName = $_.Name
$outFile = Join-Path -Path $DestinationPath -ChildPath $fileName
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $outFile, $true)
}
# close ZIP file
$zip.Dispose()
}
#
# Example
# Extract all *.txt files from archive.zip to a folder called "text-files"
$SCRIPTDIR = Split-Path $script:MyInvocation.MyCommand.Path
$zipFile = Join-Path -Path $SCRIPTDIR -ChildPath "archive.zip"
$outputDirectory = Join-Path -Path $SCRIPTDIR -ChildPath "text-files"
ExtractFromArchive -Path $zipFile -DestinationPath $outputDirectory -Filter "*.txt"