Avatar of Kelly Garcia
Kelly Garcia
Flag for United Kingdom of Great Britain and Northern Ireland asked on

Find Files older than 6 months and zip them

Hi All,

I need to find files older than 6 months and zip them, is there a script some has I can use?

Thank you in advance,
Kay
Powershell

Avatar of undefined
Last Comment
Kelly Garcia

8/22/2022 - Mon
Chris Dent

This depends a bit on your PowerShell versions. Compress-Archive is new(ish).
$files = Get-ChildItem Path -File | Where-Object LastWriteTime -lt (Get-Date).AddMonths(-6) | Select-Object -ExpandProperty FullName
Compress-Archive $files -DestinationPath something.zip

Open in new window

Kelly Garcia

ASKER
should use the -recurse, Get-ChildItem Path -File  -Recurse

Also should I utilise the lastaccesstime instead of lastwritetime?
Chris Dent

Up to you really. I don't much care when files were opened, when they were last written to is often the best metric from my point of view. It's all subjective though, you might key off CreationTime instead.
Experts Exchange is like having an extremely knowledgeable team sitting and waiting for your call. Couldn't do my job half as well as I do without it!
James Murphy
Kelly Garcia

ASKER
I have this script:


$pathname = Read-Host "Please Enter Path Name: "
GCI $pathname -Recurse | 
	?{$_.LastAccessTime -le (Get-date).AddMonths(-1)} | 
  Select FullName,CreationTime,LastAccessTime,LastWriteTime |
Export-Csv "c:\$(($pathname -split "\\")[-1]).csv" -NTI 

Open in new window


what is the best way to add the compress-archive command to this script? also any suggestions for improvement?
ASKER CERTIFIED SOLUTION
Chris Dent

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
Kelly Garcia

ASKER
I am getting this error:

Exception calling "Write" with "3" argument(s): "Stream was too long."
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:819 char:29
+ ...                     $destStream.Write($buffer, 0, $numberOfBytesRead)
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : IOException

also LastAccessTime -le (Get-date).AddMonths(-1)  - does this means files accessed less than a month ago?
Chris Dent

You're likely hitting the 2GB limit on the zip file. How much do you have in $files?

No, it means accessed a month or more ago. When comparing date, a date is considered less if it comes before the value on the right hand side of the expression. For example, yesterday is less than today.
(Get-Date).AddDays(-1) -lt (Get-Date)

Open in new window

⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
Kelly Garcia

ASKER
also I need the zip files saved in the same path along with the same files name after that I need the non zipped file deleted. should I create a new entry on experts exchange?
Kelly Garcia

ASKER
also files that are 1gb or more
Chris Dent

That 2GB stream error needs figuring out first. Chances are it'll be best to move the files to a staging area so the entire directory can be zipped.

Let's start with that:
$path = 'C:\Source'
$stagingPath = 'D:\Destination'

Push-Location $path
Get-ChildItem $path -Recurse -File | 
	Where-Object LastAccessTime -le (Get-date).AddMonths(-1) |
    ForEach-Object {
        $relative = Resolve-Path $_.Directory -Relative
        $destination = Join-Path $stagingPath $relative.TrimStart('.')
        if (-not (Test-Path $destination)) {
            $null = New-Item $destination -ItemType Directory
        }

        Copy-Item $_.FullName -Destination $destination
    }
Pop-Location

Open in new window

Start with that and check the size of everything. If it works, Copy-Item can be change to Move-Item (possibly). Alternatively, we can do one pass to generate the list, archive things, and if that works, delete the items on the list.
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
Chris Dent

> also files that are 1gb or more

It needs to be 7-zip then. The .NET components don't stand a chance. Not a big deal though, start with collecting the files together. Obviously for files that large the size of the staging area is kind of important.
Kelly Garcia

ASKER
I have written the code below:

$pathname = "C:\Users\kabir.uddin"
$files = Get-ChildItem $pathname -Recurse -File | 
	Where-Object LastAccessTime -le (Get-date).AddMonths(-1)
  
		foreach ($f in $files)
		{
			$Name = $f.fullname
			#Compress-Archive $f -DestinationPath $path\$Name.zip
		}

Open in new window

Kelly Garcia

ASKER
I will create a new entry on experts exchange
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
Kelly Garcia

ASKER
apologies on the code its $f.name not $f.fullname