views:

48

answers:

1

Trying to have "dir" command that displays size of the sub folders and files. After googling "powershell directory size", I found thew two useful links

  1. Determining the Size of a Folder http://technet.microsoft.com/en-us/library/ff730945.aspx
  2. PowerShell Script to Get a Directory Total Size http://stackoverflow.com/questions/809014/powershell-script-to-get-a-directory-total-size

These soultions are great, but I am looking for something resembles "dir" output, handy and simple and that I can use anywhere in the folder structure.

So, I ended up doing this, Any suggestions to make it simple, elegant, efficient.

Get-ChildItem | 
Format-Table  -AutoSize Mode, LastWriteTime, Name,
     @{ Label="Length"; alignment="Left";
       Expression={ 
                    if($_.PSIsContainer -eq $True) 
                        {(New-Object -com  Scripting.FileSystemObject).GetFolder( $_.FullName).Size}  
                    else 
                        {$_.Length} 
                  }
     };  

Thank you.

+2  A: 

The first minor mod would be to avoid creating a new FileSystemObject for every directory. Make this a function and pull the new-object out of the pipeline.

function DirWithSize($path=$pwd)
{
    $fso = New-Object -com  Scripting.FileSystemObject
    Get-ChildItem | Format-Table  -AutoSize Mode, LastWriteTime, Name, 
                    @{ Label="Length"; alignment="Left"; Expression={  
                         if($_.PSIsContainer)  
                             {$fso.GetFolder( $_.FullName).Size}   
                         else  
                             {$_.Length}  
                         } 
                     }
}

If you want to avoid COM altogether you could compute the dir sizes using just PowerShell like this:

function DirWithSize($path=$pwd)
{
    Get-ChildItem $path | 
        Foreach {if (!$_.PSIsContainer) {$_} `
                 else {
                     $size=0; `
                     Get-ChildItem $_ -r | Foreach {$size += $_.Length}; `
                     Add-Member NoteProperty Length $size -Inp $_ -PassThru `
                 }} |
        Format-Table Mode, LastWriteTime, Name, Length -Auto
}
Keith Hill
Thank you Keith, What I ended up doing is placing this function in the profile file, so I can access it whenever I use PS
iraSenthil