Pages: [1]
Print
Author Topic: Environment at a glace report (outputs to excel)  (Read 697 times)
esarakaitis
Administrator
Full Member
*****
Posts: 241


8223109 sack57@hotmail.com littleking57 rootinfortwayne
View Profile WWW Email
« on: February 09, 2010, 01:45:13 PM »

Code:
$initalTime = Get-Date
$filepath = "C:\tmp"
$filename = "forecast"
$date = Get-Date ($initalTime) -uformat %Y%m%d
$time = Get-Date ($initalTime) -uformat %H%M

$VCList = $global:defaultviservers

function Get-VMClusterHosts ($VMCluster) {
    $VMClusterHostNames = Get-View -Server $VC -ViewType ClusterComputeResource -Filter @{"Name"=$VMCluster.Name} | Select-Object -ExpandProperty Host | Select-Object -ExpandProperty Value
    $VMHostNameLoopCount = 0
    $VMHostNameList = ""
    if (($VMClusterHostNames | Measure-Object).Count -gt 0) {
        foreach ($VMHostName in $VMClusterHostNames) {
            $VMHostNameLoopCount++
            if ($VMHostNameLoopCount -gt 1) {
                $VMHostNameList += "|^"+$VMHostName+"$"
            } else {
                $VMHostNameList += "^"+$VMHostName+"$"
            }
        }
    }
    return $VMHostNameList
}


Write-Host "$(Get-Date ($initalTime) -uformat %H:%M:%S) - Starting"

#-----------------------------------------------------
function Release-Ref ($ref) {
([System.Runtime.InteropServices.Marshal]::ReleaseComObject(
[System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
#-----------------------------------------------------

[reflection.assembly]::loadWithPartialname("Microsoft.Office.Interop.Excel") | out-Null
$xlConstants = "microsoft.office.interop.excel.Constants" -as [type]
$objExcel = new-object -comobject excel.application
#$objExcel.Visible = $True
$objWorkbook = $objExcel.Workbooks.Add()

while ($objWorkbook.Worksheets.Count -ne $VCList.Count) {
    if ($objWorkbook.Worksheets.Count -gt $VCList.Count) {
        $objWorkbook.Worksheets.Item($objWorkbook.Worksheets.Count).Delete()
    } elseif ($objWorkbook.Worksheets.Count -lt $VCList.Count) {
        $objWorkbook.Worksheets.Add()
    }
}

Write-Host "$(Get-Date -uformat %H:%M:%S) - $(($VCList | Measure-Object).Count) VC(s) acquired"

$i = 0
if ((($VCList | Measure-Object).Count) -gt 0) {
    ForEach ($VC in ($VCList | Sort-Object)) {
        $i++
        $rowCount = 1
        $objWorksheet = $objWorkbook.Worksheets.Item($i)
        $objWorksheet.Name = $VC
        Write-Host "$(Get-Date -uformat %H:%M:%S) - $($i) of $(($VCList | Measure-Object).Count) - $($VC)"
        #setup columns
        $clusterColumns = @("ClusterName", "NumHosts", "TotalCpuCapacityGHz", "TotalCpuDemandGHz", "% CPU Demand", "TotalMemoryCapacityGB", "AllocatedMemoryGB", "% Allocated", "NumGuests", "AvgGuestRamGB")
        foreach ($clusterColumn in $clusterColumns) {
            $j = 0..($clusterColumns.length - 1) | ? {$clusterColumns[$_] -eq $clusterColumn}
            $objWorksheet.Cells.Item($rowCount,($j+1)).Value() = "$clusterColumn"
        }
       
        $VMClusterList = Get-View -Server $VC -ViewType ClusterComputeResource | Sort-Object Name
       
        if (($VMClusterList | Measure-Object).Count -gt 0) {
            ForEach ($VMCluster in $VMClusterList) {
                $rowCount++
                $objWorksheet.Cells.Item($rowCount,1).Value() = "$($VMCluster.Name)"
                $objWorksheet.Cells.Item($rowCount,2).Value() = "$($VMCluster.Summary.NumHosts)"
                $objWorksheet.Cells.Item($rowCount,3).Formula = "=($($VMCluster.Summary.TotalCpu)/1000)"
                $objWorksheet.Cells.Item($rowCount,6).Formula = "=($($VMCluster.Summary.TotalMemory)/(1024^3))"
                $VMHostNameList = Get-VMClusterHosts $VMCluster
                if ($VMHostNameList.Length -gt 0) {
                    $VMClusterGuestList = Get-View -Server $VC -ViewType VirtualMachine -Filter @{"Runtime.Host"=$VMHostNameList; "Runtime.PowerState"="poweredOn"; "Config.Template"="False"} | Sort-Object Name
                    if (($VMClusterGuestList | Measure-Object).Count -gt 0) {
                        $VMClusterOverallCpuDemand = ($VMClusterGuestList | Select-Object -ExpandProperty Summary | Select-Object -ExpandProperty QuickStats | Measure-Object -Property OverallCpuDemand -Sum).Sum
                        #$VMClusterAllocatedGuestMemoryMB = ($VMClusterGuestList | Select-Object -ExpandProperty Summary | Select-Object -ExpandProperty QuickStats | Measure-Object -Property HostMemoryUsage -Sum).Sum
                        $VMClusterAllocatedGuestMemoryMB = ($VMClusterGuestList | Select-Object -ExpandProperty Config | Select-Object -ExpandProperty Hardware | Measure-Object -Property MemoryMB -Sum).Sum
                        $objWorksheet.Cells.Item($rowCount,4).Formula = "=($($VMClusterOverallCpuDemand)/(1000))"
                        $objWorksheet.Cells.Item($rowCount,7).Formula = "=($($VMClusterAllocatedGuestMemoryMB)/(1024))"
                        $objWorksheet.Cells.Item($rowCount,9).Value() = "$(($VMClusterGuestList | Measure-Object).Count)"
                    } else {
                        $objWorksheet.Cells.Item($rowCount,4).Value() = "0"
                        $objWorksheet.Cells.Item($rowCount,7).Value() = "0"
                        $objWorksheet.Cells.Item($rowCount,9).Value() = "0"
                    }
                } else {
                    $objWorksheet.Cells.Item($rowCount,4).Value() = "0"
                    $objWorksheet.Cells.Item($rowCount,7).Formula = "0"
                    $objWorksheet.Cells.Item($rowCount,9).Value() = "0"
                }
                $objWorksheet.Cells.Item($rowCount,5).Formula = "=IF(C$rowCount=0, 0, D$rowCount/C$rowCount)"
                $objWorksheet.Cells.Item($rowCount,8).Formula = "=IF(F$rowCount=0, 0, G$rowCount/F$rowCount)"
                $objWorksheet.Cells.Item($rowCount,10).Formula = "=IF(I$rowCount=0, 0, G$rowCount/I$rowCount)"
            }
        }
        $endRow = $objWorksheet.UsedRange.Rows.Count
        $rowCount = $rowCount+2
        $objWorksheet.Cells.Item($rowCount,1).Value() = "Totals"
        $objWorksheet.Cells.Item($rowCount,2).Formula = "=SUM(B2:B$endRow)"
        $objWorksheet.Cells.Item($rowCount,3).Formula = "=SUM(C2:C$endRow)"
        $objWorksheet.Cells.Item($rowCount,4).Formula = "=SUM(D2:D$endRow)"
        $objWorksheet.Cells.Item($rowCount,5).Formula = "=IF(C$rowCount=0, 0, D$rowCount/C$rowCount)"
        $objWorksheet.Cells.Item($rowCount,6).Formula = "=SUM(F2:F$endRow)"
        $objWorksheet.Cells.Item($rowCount,7).Formula = "=SUM(G2:G$endRow)"
        $objWorksheet.Cells.Item($rowCount,8).Formula = "=IF(F$rowCount=0, 0, G$rowCount/F$rowCount)"
        $objWorksheet.Cells.Item($rowCount,9).Formula = "=SUM(I2:I$endRow)"
        $objWorksheet.Cells.Item($rowCount,10).Formula = "=IF(I$rowCount=0, 0, G$rowCount/I$rowCount)"
        $endRow = $objWorksheet.UsedRange.Rows.Count
        $objWorksheet.range("C2:D$endRow").NumberFormat = "0"
        $objWorksheet.range("E2:E$endRow").NumberFormat = "0%"
        $objWorksheet.range("F2:G$endRow").NumberFormat = "0"
        $objWorksheet.range("H2:H$endRow").NumberFormat = "0%"
        $objWorksheet.range("I2:I$endRow").NumberFormat = "0"
        $objWorksheet.range("J2:J$endRow").NumberFormat = "0.00"
       
        $VMDatastoreList = Get-View -Server $VC -ViewType Datastore -Filter @{"Summary.Type"="VMFS"; "Summary.MultipleHostAccess"="True"}
        if (($VMDatastoreList | Measure-Object).Count -gt 0) {
            $rowCount = $rowCount+4
            $datastoreRow = $rowCount +1
            $datastoreColumns = @("DatastoreName", "FreeSpaceGB", "% Free", "TotalCapacityGB")
            ForEach ($datastoreColumn in $datastoreColumns) {
                $j = 0..($datastoreColumns.length - 1) | ? {$datastoreColumns[$_] -eq $datastoreColumn}
                $objWorksheet.Cells.Item($rowCount,($j+1)).Value() = "$datastoreColumn"
            }
            ForEach ($VMDatastore in $VMDatastoreList) {
                $rowCount++
                $objWorksheet.Cells.Item($rowCount,1).Value() = "$($VMDatastore.Name)"
                $objWorksheet.Cells.Item($rowCount,2).Formula = "=($($VMDatastore.Summary.FreeSpace)/(1024^3))"
                $objWorksheet.Cells.Item($rowCount,3).Formula = "=(B$($rowCount)/D$($rowCount))"
                $objWorksheet.Cells.Item($rowCount,4).Formula = "=($($VMDatastore.Summary.Capacity)/(1024^3))"
            }
            $endRow = $objWorksheet.UsedRange.Rows.Count
            $rowCount = $rowCount+2
            $objWorksheet.Cells.Item($rowCount,1).Value() = "Totals"
            $objWorksheet.Cells.Item($rowCount,2).Formula = "=SUM(B$($datastoreRow):B$($endRow))"
            $objWorksheet.Cells.Item($rowCount,3).Formula = "=(B$($rowCount)/D$($rowCount))"
            $objWorksheet.Cells.Item($rowCount,4).Formula = "=SUM(D$($datastoreRow):D$($endRow))"
            $endRow = $objWorksheet.UsedRange.Rows.Count
            $objWorksheet.range("B$($datastoreRow):B$($endRow)").NumberFormat = "0"
            $objWorksheet.range("C$($datastoreRow):C$($endRow)").NumberFormat = "0%"
            $objWorksheet.range("D$($datastoreRow):D$($endRow)").NumberFormat = "0"
        }
        $objWorksheet.UsedRange.EntireColumn.HorizontalAlignment = $xlConstants::xlRight
        $objWorksheet.Cells.Item(1,1).EntireColumn.HorizontalAlignment = $xlConstants::xlLeft
        $objWorksheet.UsedRange.EntireColumn.AutoFit() | out-Null
    }
}

$objExcel.Visible = $True

$a = Release-Ref($objWorksheet)
$a = Release-Ref($objWorkbook)
$a = Release-Ref($objExcel)

$conclusionTime = Get-Date
Write-Host "$(Get-Date ($conclusionTime) -uformat %H:%M:%S) - Finished"
$totalTime = New-TimeSpan $initalTime $conclusionTime
Write-Host "$($totalTime.Hours):$($totalTime.Minutes):$($totalTime.Seconds) - Total Time"
« Last Edit: March 04, 2010, 10:16:38 AM by esarakaitis » Logged
Pages: [1]
Print
Jump to: