Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove files from .zip file with Powershell

Tags:

powershell

I am going to write a Powershell script to remove files from a .zip file. In my .zip file, I have test.txt (latest) test1.txt (older) test2.txt .... testN.txt (oldest), all with different file sizes (or in powershell, it's called Length). I want to keep only 2G or smaller of them and remove the rest. It is required to remove from the oldest ones. Since the .zip file may be very large. It's better not to extract it and zip again.

Is there any way to achieve this?

Thank you so much.

like image 747
Payson Avatar asked Dec 11 '22 09:12

Payson


1 Answers

Adopting this VBScript solution:

$zipfile = 'C:\path\to\your.zip'
$files   = 'some.file', 'other.file', ...
$dst     = 'C:\some\folder'

$app = New-Object -COM 'Shell.Application'
$app.NameSpace($zipfile).Items() | ? { $files -contains $_.Name } | % {
  $app.Namespace($dst).MoveHere($_)
  Remove-Item (Join-Path $dst $_.Name)
}

If you have .net Framework 4.5 installed, something like this should work, too:

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression')

$zipfile = 'C:\path\to\your.zip'
$files   = 'some.file', 'other.file', ...

$stream = New-Object IO.FileStream($zipfile, [IO.FileMode]::Open)
$mode   = [IO.Compression.ZipArchiveMode]::Update
$zip    = New-Object IO.Compression.ZipArchive($stream, $mode)

($zip.Entries | ? { $files -contains $_.Name }) | % { $_.Delete() }

$zip.Dispose()
$stream.Close()
$stream.Dispose()

The parentheses around filtering items from the Entries collection are required, because otherwise the subsequent Delete() would modify the collection. This would prevent reading (and thus deleting) other items from the collection. The resulting error message looks like this:

An error occurred while enumerating through a collection: Collection was modified;
enumeration operation may not execute..
At line:1 char:1
+ $zip.Entries | ? { $filesToRemove -contains $_.Name } | % { $_.Delete() }
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Collecti...ipArchiveEntry]:Enumerator) [], RuntimeException
    + FullyQualifiedErrorId : BadEnumeration
like image 186
Ansgar Wiechers Avatar answered Dec 29 '22 19:12

Ansgar Wiechers