2013-08-06 52 views
3
CPU,内存使用率和可用磁盘空间

能不能帮我这三个脚本合并到一个格式是这样的获取使用PowerShell

ComputerName  CPUUsageAverage MemoryUsage C PercentFree 
xxx       12   50%    30% 

我执行这一问题的方法是: Get-content '.\servers.txt' | Get-CPUusageAverage

这里是脚本:

CPU

Function Get-CPUusageAverage 
{ 
$input|Foreach-Object{Get-WmiObject -computername $_ win32_processor | Measure-Object -property LoadPercentage -Average | Select Average} 
} 

内存

Function get-MemoryUsage 
{ 
$input|Foreach-Object{ 
gwmi -Class win32_operatingsystem -computername $_ | 
Select-Object @{Name = "MemoryUsage"; Expression = { “{0:N2}” -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)*100)/ $_.TotalVisibleMemorySize) } 
} 
} 
} 

ÇPercentFree

Function get-CPercentFree 
{ 
$input|ForEach-Object{ 
    Get-WmiObject -Class win32_Volume -ComputerName $_ -Filter "DriveLetter = 'C:'" | 
    Select-object @{Name = "C PercentFree"; Expression = { “{0:N2}” -f (($_.FreeSpace/$_.Capacity)*100) } } 
} 
} 

回答

7

首先,我会避免使用$输入。你可以只组合查询到单一的功能,然后输出具有每个计算机例如数据pscustomobject:

function Get-ComputerStats { 
    param(
    [Parameter(Mandatory=$true, Position=0, 
       ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] 
    [ValidateNotNull()] 
    [string[]]$ComputerName 
) 

    process { 
    foreach ($c in $ComputerName) { 
     $avg = Get-WmiObject win32_processor -computername $c | 
        Measure-Object -property LoadPercentage -Average | 
        Foreach {$_.Average} 
     $mem = Get-WmiObject win32_operatingsystem -ComputerName $c | 
        Foreach {"{0:N2}" -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)*100)/ $_.TotalVisibleMemorySize)} 
     $free = Get-WmiObject Win32_Volume -ComputerName $c -Filter "DriveLetter = 'C:'" | 
        Foreach {"{0:N2}" -f (($_.FreeSpace/$_.Capacity)*100)} 
     new-object psobject -prop @{ # Work on PowerShell V2 and below 
     # [pscustomobject] [ordered] @{ # Only if on PowerShell V3 
      ComputerName = $c 
      AverageCpu = $avg 
      MemoryUsage = $mem 
      PercentFree = $free 
     } 
    } 
    } 

cat '.\servers.txt' | Get-ComputerStats | Format-Table 
+0

任何想法是什么导致CPU的输出像 '@ {Average = 46}'和第三列的ComputerName列? – Dumont

+1

哈希表的方法。如果你在V3上,你可以将'new-object ...'行改成'[pscustomobject] [ordered] @ {'来修改属性的顺序。 –

2

如何:

cat '.\servers.txt' | % {select -property @{'n'='CPUUsageAverage';'e'={$_ | Get-CPUUsageAverage}},@{'n'='Memory Usage';'e'={$_ | Get-MemoryUsage}},@{'n'=C PercentFree';'e'={$_ | Get-CPercentFree}}} 
+0

如何执行此操作?我应该将所有三个脚本合并到一个PowerShell文件中吗? – Dumont

-1

道歉上面我以前的帖子(编辑本),这里有一个脚本,我使用获得的平均CPU,Mem和C驱动器生成HTML文件的可用空间

$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

发布一个新问题。不要作为回答发布,因为...这不是一个答案。你也发布了一个问题,并在3年​​前回答。 –

+0

对不起,大卫和RamenChef,我会记下它。无论如何,我编辑了我的帖子,现在显示为答案。希望这一切都很好。 感谢您的意见。 顺便说一句大卫,你已经提到3年前已经回答了,你能指出那个答案的链接吗?谢谢 – Gibo

+0

@Gibo答案发布到您发布到的完全相同的问题。随着一堆upvotes和OP的接受。 –