user2523902
user2523902

Reputation: 41

How to sum only 2nd column values using powershell?

sharesize.ps1

echo " "
$date1 = Get-Date
Write-Host -foreground Yellow -background Black "Script Started at $date1"

$path = "\*"

get-childitem $path | where {$_.PSIsContainer} | foreach { 

$size = (Get-ChildItem $_ -recurse | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum 

$size = "{0:N2}" -f ($size / 1MB) + " MB"

$obj = new-object psobject 
add-member -inp $obj noteproperty Path $_.fullName 
add-member -inp $obj noteproperty "Size(MB)" $size 
[array]$report += $obj
}


#display the table
$a = "<style>"
$a = $a + "BODY{background-color:green;}"
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$a = $a + "TH{border-width: 2px;padding: 0px;border-style: solid;border-color: black;background-color:Yellow; font-family: Arial; font-size: 12pt}"
$a = $a + "TD{border-width: 2px;padding: 2px 6px 2px 3px;border-style: solid;border-color: black;background-color:Azure; font-family: Arial; font-size: 10pt}"
$a = $a + "</style>"


$report | Sort 'Size' -Descending | ConvertTo-HTML -head $a -title "Process Information" -body "<H2>Service Information</H2>"| Out-File -Append c:\temp\folder.html


$date2 = Get-Date
echo " "
Write-Host -foreground Yellow -background Black "Script Ended at $date2"
echo " "

Above code is working great to me, help is much appreciated for the below help.

Here my requirement is to add sum of 2nd column volues and append the output to the last line of the above code output html(c:\temp\folder.html) as,


       Path                   | Size(MB)

 C:\NVIDIA\Displaydriver      |  400 MB
  *                           |  860 MB
  *                           |  100 MB
  *                           |   * MB
  *                           |   * MB

       Total                  |  1000 MB(sum of all numbers in 2nd column values)

and also i need to align the 2nd column values and Total row to CENTER.

Please Help

Upvotes: 3

Views: 27418

Answers (3)

Henry Cano
Henry Cano

Reputation: 1

I had a similar need and here is my simple solution:

$stuff=get-stuff
$results=
    foreach ($item in $stuff) {
        $item | select column1,@{N="Column 2";E={$_.column2}},description,created,@{N="Size (GB)";E={"{0:N2}" -f $_.sizegb}}
    }

$results_sorted=@($results | sort created)
$results_sorted+=$item | select @{N="column1";E={"Totals"}},@{N="Column 2";E={$null}},@{N="Description";E={$null}},@{N="Created";E={$null}},@{N="Size (GB)";E={($results | Measure-Object "size (gb)" -Sum).Sum}}
$results_sorted | ft column1,"Column 2",Description,Created,"Size (GB)"

Upvotes: 0

Cole9350
Cole9350

Reputation: 5570

$total = 0 
$report | % {[float]$tmp = $_."Size(MB)".TrimEnd(" MB"); $total += $tmp}

Then you can just add the $total object to your custom $report object before you convertTo-html and bango. Thanks for the neat script.

Only thing that confused me a little was your () your size property of $report makes PS think its a method, thus the quotes. Is not the best convention, but it works.

More explicitly :

...
[array]$report += $obj
}

$total = 0 
$report | % {[float]$tmp = $_."Size(MB)".TrimEnd(" MB"); $total += $tmp}
$obj = new-object psobject 
add-member -inp $obj noteproperty Path "Total Size: "
add-member -inp $obj noteproperty "Size(MB)" $total 
[array]$report += $obj
#display the table
...

Also, Remove | Sort Size -Descending for the total to appear on the bottom.

Upvotes: 0

Keith Hill
Keith Hill

Reputation: 201692

To sum the sizes do this:

$totalSize = ($report | Measure-Object 'Size(MB)' -Sum).Sum

Upvotes: 12

Related Questions