AnemonePoppy
AnemonePoppy

Reputation: 51

Powershell Search

Here is what I am trying to do:

  1. Search my computer for files ending with a .doc, .docx, .xls, or .xlsx
  2. Output the filenames and sizes (in groups by file extension) to a text file named “File_Summary.txt”.
  3. I also want the total of the number of files and total file size for each file extension listed in the output.

I can't even get past the check folder part:

$Folder_To_Check = C:\AIU

$Report_File_Location = "File_Summary.txt"

$files= Get-Childitem -Path $Folder_To_Check-Include *doc, *docx, *xls, *xlsx $Report_File_Location
$totalfiles = ($files | Measure-Object).Count
$totalsize = ($files | Measure-Object -Sum Length).Sum

Update. Here is my code again with some changes I made from the suggestions, but I'm still coming up empty.

$Report_File_Location = "File_Summary.txt"

$files= Get-Childitem C:\AIU -include "*doc", "*docx", "*xls", "*xlsx"-recurse | Sort-Object | Get-Unique -asString

$files | Out-File $Report_File_Location

$totalfiles = ($files | Measure-Object).Count
$totalsize = ($files | Measure-Object -Sum Length).Sum 

write-host "totalfiles: $totalfiles"
write-host "totalsize: $totalsize"

The more I was looking about this I think I shouldn't use the Sort-Object but to use Group Extension -NoElement | Sort Count -Descending that would give me the total number of files for each type?

UPDATE Thanks to help of people here I got my code to work. But I had an issue where it was saying that my file didn't exist. The problem? I needed to list the entire folder path and use SINGLE quotes.

This code works:

$Folder_To_Check = 'C:\Users\Sarah\Documents\AIU'
$Report_File_Location = "File_Summary.txt"

$results = Get-ChildItem $Folder_To_Check -Include *.doc,*.docx,*.xls,*.xlsx -Recurse
$results | Group-Object extension | ForEach-Object {
    [PSCustomObject]@{
        Results = $_.Name
        Count = $_.Count
        Size = [Math]::Round(($_.Group | Measure-Object -Sum Length | Select-Object -    ExpandProperty Sum) / 1MB,2)
    }
} | Out-File $Report_File_Location -Append

BIG props to Matt for helping me organize my results so nice. Thank you for helping me learn.

Upvotes: 1

Views: 571

Answers (3)

Matt
Matt

Reputation: 46710

$Folder_To_Check = C:\AIU
$Report_File_Location = "File_Summary.txt"

$results = Get-ChildItem $Folder_To_Check -Include *.doc,*.docx,*.xls,*.xlsx -Recurse 
$results | Group-Object extension | ForEach-Object {
    [PSCustomObject]@{
        Extension = $_.Name
        Count = $_.Count
        Size = [Math]::Round(($_.Group | Measure-Object -Sum Length | Select-Object -ExpandProperty Sum) / 1MB,2)
    }
} | Out-File $Report_File_Location -Append

Get all of the files you are looking for with Get-ChildItem much like you were. Vasja mentioned it as well that you might want to use -Recurse to get results from sub directories as well. Use Group-Object to collect the files by extension. For each collection output a custom object of the extension and file count, which both come Group-Object, and the size of all the files of that particular extension converted to MB and rounded to 2 decimal places.

Update for 2.0

In case you only have 2.0 installed I wanted to provide and answer that works for that.

$results | Group-Object extension | ForEach-Object {
    $properties = @{
        Extension = $_.Name
        Count = $_.Count
        Size = [Math]::Round(($_.Group | Measure-Object -Sum Length | Select-Object -ExpandProperty Sum) / 1MB,2)
    }
    New-Object -TypeName PSObject -Property $properties
}

Upvotes: 4

TheMadTechnician
TheMadTechnician

Reputation: 36297

Yep, you need a collection of strings for the -Include argument. So, what you tried is one string, that being:

"*doc, *docx, *xls, *xlsx"

While the commas do need to seperate the extensions when you include it within the quotes it thinks that's a part of the one thing to include, so it's seriously looking for files that have anything (as per the asterisk) then "doc," then anything then "docx," then anything then... you see where I'm going. It thinks it has to include all of that. Instead you need a collection of strings like:

-Include "*doc","*docx","*xls","xlsx"

I hope that helps. Here's your line modified to what should work:

$files= Get-Childitem -Path $Folder_To_Check-Include "*doc", "*docx", "*xls", "*xlsx"

Upvotes: 0

vasja
vasja

Reputation: 4792

Added some quotes. Also you probably want -Recurse on Get-Childitem

$Folder_To_Check = "C:\AIU"
$Report_File_Location = "E:\tmp\File_Summary.txt"
$files = Get-Childitem -Path $Folder_To_Check -Include *doc, *docx, *xls, *xlsx -Recurse

$files | Out-File $Report_File_Location

$totalfiles = ($files | Measure-Object).Count
$totalsize = ($files | Measure-Object -Sum Length).Sum

write-host "totalfiles: $totalfiles"
write-host "totalsize: $totalsize"

Upvotes: 2

Related Questions