Avatar of Kelly Garcia
Kelly GarciaFlag 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
Avatar of Chris Dent
Chris Dent
Flag of United Kingdom of Great Britain and Northern Ireland image

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

Avatar of Kelly Garcia
Kelly Garcia
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

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

Also should I utilise the lastaccesstime instead of lastwritetime?
Avatar of Chris Dent
Chris Dent
Flag of United Kingdom of Great Britain and Northern Ireland image

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.
Avatar of Kelly Garcia
Kelly Garcia
Flag of United Kingdom of Great Britain and Northern Ireland image

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
Avatar of Chris Dent
Chris Dent
Flag of United Kingdom of Great Britain and Northern Ireland image

Blurred text
THIS SOLUTION IS 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
Avatar of Kelly Garcia
Kelly Garcia
Flag of United Kingdom of Great Britain and Northern Ireland image

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?
Avatar of Chris Dent
Chris Dent
Flag of United Kingdom of Great Britain and Northern Ireland image

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

Avatar of Kelly Garcia
Kelly Garcia
Flag of United Kingdom of Great Britain and Northern Ireland image

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?
Avatar of Kelly Garcia
Kelly Garcia
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

also files that are 1gb or more
Avatar of Chris Dent
Chris Dent
Flag of United Kingdom of Great Britain and Northern Ireland image

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.
Avatar of Chris Dent
Chris Dent
Flag of United Kingdom of Great Britain and Northern Ireland image

> 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.
Avatar of Kelly Garcia
Kelly Garcia
Flag of United Kingdom of Great Britain and Northern Ireland image

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

Avatar of Kelly Garcia
Kelly Garcia
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

I will create a new entry on experts exchange
Avatar of Kelly Garcia
Kelly Garcia
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

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

Windows PowerShell is a task automation and configuration management framework from Microsoft, consisting of a command-line shell and associated scripting language built on the .NET Framework. PowerShell provides full access to the Component Object Model (COM) and Windows Management Instrumentation (WMI), enabling administrators to perform administrative tasks on both local and remote Windows systems as well as WS-Management and Common Information Model (CIM) enabling management of remote Linux systems and network devices.

27K
Questions
--
Followers
--
Top Experts
Get a personalized solution from industry experts
Ask the experts
Read over 600 more reviews

TRUSTED BY

IBM logoIntel logoMicrosoft logoUbisoft logoSAP logo
Qualcomm logoCitrix Systems logoWorkday logoErnst & Young logo
High performer badgeUsers love us badge
LinkedIn logoFacebook logoX logoInstagram logoTikTok logoYouTube logo