2013-08-06 53 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的接受。 –