Group unique filenames by expression?

I have a directory full of unique names, all in the same format - Scriptname_datecodestuff.txt
How can I group these based on 'scriptname' ?
What I need to accomplish is I only want to have 10 'versions' of a file in this directory, so if their are more than 10, I need to delete the oldest of that group

Example files in the dir
localhost_11.02.2010-0645.txt
localhost_11.02.2010-0655.txt
localhost_11.02.2010-0705.txt
otherhost_11.02.2010-0645.txt
otherhost_11.02.2010-0650.txt
otherhost_11.02.2010-0650.txt

With those listtings, the 2 groups would be localhost with a count of 3, and otherhost with a count of 3.

I have something semi working, but its not elogant, and suffers some bad performance..
$Group =$File.Name.SubString(0,(($File.Name.Length)-20))
ElseIf (($Directory | Where {$_.Name -Match $Group} | %{$_.Name.SubString(0,(($_.Name.Length)-20))} | Group | %{$_.count}) -gt 10) {
		$Directory | Where {$_.Name -Match $Group} | Sort -Property LastWriteTime | Select -First 1 | Remove-Item

Open in new window

LVL 6
rwskasAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
soostibiConnect With a Mentor Commented:
Try this:

Get-ChildItem C:\temp | foreach-object {
    Add-Member -InputObject $_ -MemberType noteproperty -Name Groupname -Value $(if($_.name -match "^[^_]*"){$matches[0]}else{$null}) -PassThru} | ?{$_.groupname} |
        Group-Object -Property groupname | ?{$_.count -gt 10} | foreach-object {
            $_.group | Sort-Object -Property lastwritetime | Select-Object -First 1 | Remove-Item
        }

Open in new window

0
 
rwskasAuthor Commented:
Sorry, that attached code was taken out of the entire script to just show the pieces that are relevant, the 2 lines dont flow together.
$file is a gci object
$directory = gci c:\temp
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.