0
votes

I am trying to write a script using powershell to get folder / file size as mentioned below

$StartFolder = "D:\"
$Output = "C:\Temp\test-d.csv"

Add-Content -Value "Folder Path|Size" -Path $Output

$colItems = (Get-ChildItem $startFolder -Recurse | Measure-Object -Property Length -Sum)
"$StartFolder -- " + "{0:N2}" -f ($colItems.Sum / 1MB) + " MB" # | Out-File $Output

$colItems = (Get-ChildItem $startFolder -Recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object)
foreach ($i in $colItems) {
    $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object -Property Length -Sum)
    $i.FullName + "|" + "{0:N2}" -f ($subFolderItems.Sum / 1MB) + " MB" | Out-File $Output -Append
}

I am getting error as mentioned below:

Measure-Object : The property "Length" cannot be found in the input for any
objects.
At line:12 char:65
+         $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ...
+
    + CategoryInfo          : InvalidArgument: (:) [Measure-Object], PSArgumentException
    + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand

Measure-Object : The property "Length" cannot be found in the input for any
objects.
At line:12 char:65
+         $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ...
+
    + CategoryInfo          : InvalidArgument: (:) [Measure-Object], PSArgumentException
    + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand

Also, when I target C: drive I am getting "access denied" on some system files:

Get-ChildItem : Access to the path 'C:\Windows\System32\LogFiles\WMI\RtBackup'
is denied.
At line:12 char:28
+         $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ...
+                            
    + CategoryInfo          : PermissionDenied: (C:\Windows\Syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
1
If you are not an admin or do not have privileges , you wont be able to modify system directories like that. So either you can try with run as admin or give necessary permissions. since its not having access, it is not able to pick the length.Ranadip Dutta
Why the hell are you concatenating table viewl with pipes like that? PowerShell has built in support for csv, json and there are modules for excel as well...Clijsters

1 Answers

3
votes

DirectoryInfo objects don't have a property Length, so you need to restrict your size calculation to files.

$colItems = Get-ChildItem $startFolder -Recurse -Force |
            Where-Object { -not $_.PSIsContainer } |
            Measure-Object -Property Length -Sum

It might be easier to use a Scripting.FileSystemObject COM object, because that will allow you to get directory objects with the size of their content. And you may want to use Export-Csv for exporting your data to a CSV. Use calculated properties for building the required objects.

$fso = New-Object -COM 'Scripting.FileSystemObject'

$folders = @($StartFolder)
$folders += Get-ChildItem $StartFolder -Recurse -Force |
            Where-Object { $_.PSIsContainer } |
            Select-Object -Expand FullName

$folders |
    Select-Object @{n='Path';e={$_}}, @{n='Size';e={$fso.GetFolder($_).Size}} |
    Export-Csv $Output -Delimiter '|' -NoType