2016-08-28 26 views
0

新手在这里,:-)Powershell - 多服务器CPU /内存/ C驱动器统计 - 总计平均

希望你一切顺利,伸出援助之手;

我有一个代码也可以生成多个服务器的CPU/Mem/C驱动器统计,并希望寻求帮助,如果这可能有所有服务器的总平均数?使用下面的脚本,是否有一种方法可以包括获取我收集的所有服务器(例如10台服务器)的总平均值?

$ServerListFile = "D:\serverList.txt" 
$ServerList = Get-Content $ServerListFile -ErrorAction SilentlyContinue 
$Result = @() 
ForEach($computername in $ServerList) 
{ 

$AVGProc = Get-WmiObject -computername $computername win32_processor | 
Measure-Object -property LoadPercentage -Average | Select Average 
$OS = gwmi -Class win32_operatingsystem -computername $computername | 
Select-Object @{Name = "MemoryUsage"; Expression = {“{0:N2}” -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)*100)/ $_.TotalVisibleMemorySize) }} 
$vol = Get-WmiObject -Class win32_Volume -ComputerName $computername -Filter "DriveLetter = 'C:'" | 
Select-object @{Name = "C PercentFree"; Expression = {“{0:N2}” -f (($_.FreeSpace/$_.Capacity)*100) } } 

$result += [PSCustomObject] @{ 
ServerName = "$computername" 
CPULoad = "$($AVGProc.Average)%" 
MemLoad = "$($OS.MemoryUsage)%" 
CDrive = "$($vol.'C PercentFree')%" 
} 
$Outputreport = "<HTML><TITLE> Server Health Report </TITLE> 
      <BODY background-color:peachpuff> 
      <font color =""#99000"" face=""Microsoft Tai le""> 
      <H2> Server Health Report </H2></font> 
      <Table border=1 cellpadding=0 cellspacing=0> 
      <TR bgcolor=gray align=center> 
       <TD><B>Server Name</B></TD> 
       <TD><B>Avrg.CPU Utilization</B></TD> 
       <TD><B>Memory Utilization</B></TD> 
       <TD><B>Drive C Free Space</B></TD> 
       </TR>" 

Foreach($Entry in $Result) 

    { 
    if(($Entry.CpuLoad) -or ($Entry.memload) -ge "80") 
    { 
    $Outputreport += "<TR bgcolor=white>" 
    } 
    else 
    { 
    $Outputreport += "<TR>" 
    } 
    $Outputreport += "<TD>$($Entry.Servername)</TD><TD align=center>$($Entry.CPULoad)</TD><TD align=center>$($Entry.MemLoad)</TD><TD align=center>$($Entry.CDrive)</TD></TR>" 
} 
$Outputreport += "</Table></BODY></HTML>" 
} 

$Outputreport | out-file "D:\Result $(Get-Date -Format yyy-mm-dd-hhmm).htm" 

回答

0

既然你已经把所有的$Result阵列中提供的数字,你可以简单地管它Measure-Object得到的平均值。

问题是,您已将原始数值转换为字符串并在百分号%后缀。使用Select-Object转身取出%所以我们可以再次治疗值作为数字:

$CPUAvg = $Result |Select-Object @{Label='CPU';Expr={$_.CPULoad -replace '%'}} |Measure-Object CPU -Average |Select-Object -Expand Average 
$MemAvg = $Result |Select-Object @{Label='Mem';Expr={$_.MemLoad -replace '%'}} |Measure-Object Mem -Average |Select-Object -Expand Average 
$CDriveAvg = $Result |Select-Object @{Label='CDrive';Expr={$_.CDrive -replace '%'}} |Measure-Object CDrive -Average |Select-Object -Expand Average 

请注意,这种比较:

($Entry.memload) -ge "80" 

会产生意想不到的结果同样的理由以上。

比较字符串时,"9" -ge "80"将产生$true - 你可能预期不是

+0

喜马蒂亚斯,感谢您的答复;不幸的是,我对结果没有任何价值,我在测试结果中看到的是,将另一行插入到它获得的每个服务器。它可能在我放置你的代码的地方;仍然不确定,为什么它返回一个空值。 – Gibo

+0

另外,在显示结果后我能将其转换回百分比吗?我应该使用 LoadPercentage -Average 或者只是普通的 “$($ CPUAve)%” – Gibo