使用powershell獲取進程的CPU內存狀態,並導出到excel。

在Windows中,監視某個進程的狀態,可使用 perfmon 性能監視器。可是他的報表沒法導出到excel,通過一番折騰以後,找到了powershell的解決方案,固然可能不如c#+.net framwork優秀。git

如今使用powershell來監視進程的狀態,首先須要powershell 4.0及以上。github

查看版本的方式:打開powershell  運行shell

$psversiontable.psversion

若是是win7系統能夠升級到4.0或者5.0c#

powershell 5.0 下載連接:https://www.microsoft.com/en-us/download/details.aspx?id=50395數組

如今建立一個powershell腳本文件:例如process.ps1瀏覽器

編輯文件,首先定義一些參數app

$appname = "tim" #進程簡稱
$xc = 4 #CPU線程數
$line = 10#行數
$zhouqi = 2 #取樣週期   
$data = 1..$line
$path=[Environment]::GetFolderPath("Desktop")#保存路徑,此路徑爲桌面

進程簡稱是爲了系列進程考慮,也可使用全稱;行數就是取樣的次數,行數乘以採樣週期就是整個的監視時間。保存路徑能夠自定,此處使用桌面dom

另一個主要的方法是監視進程函數

 1 function getCPU ([string]$iProcess) {
 2     $z = "*$iProcess*" #帶'*'用於模糊查找,好比一些列進程名字不一樣,eg:MicrosoftEdge,MicrosoftEdgeCP
 3     $process1 = Get-Process $z
 4  
 5     $a = $process1.CPU  
 6     sleep $zhouqi
 7     $process2 = Get-Process $z
 8     $b = $process2.CPU  
 9     $d = $process2.ProcessName 
10     $f = $process2.WS
11  
12     $c = New-Object object
13     Add-Member -InputObject $c -Name prea -Value "$a" -MemberType NoteProperty;
14     Add-Member -InputObject $c -Name preb -Value "$b" -MemberType NoteProperty;    
15     Add-Member -InputObject $c -Name pro -Value "$d" -MemberType NoteProperty;
16     Add-Member -InputObject $c -Name mem -Value "$f" -MemberType NoteProperty;   
17 
18     return $c
19     
20 }

這個函數的返回值 是一個數組對象,包含採樣前的CPU時間,採樣後的CPU時間,以及內存和進程全名。性能

下面使用定義的getCPU函數獲取進程的信息並處理

function  getData($a, $b) {
    $dataobject = New-Object object 
    $time=getDate
    Add-Member -InputObject $dataobject -Name time -Value " $time " -MemberType NoteProperty;    
    Add-Member -InputObject $dataobject -Name mem -Value " $a " -MemberType NoteProperty;
    Add-Member -InputObject $dataobject -Name pre -Value " $b " -MemberType NoteProperty;
  
    return $dataobject
}
for ($m = 0; $m -le ($line - 1); $m++) {
    $return = (getCPU $appname)
    $arraya = $return.prea
    $arrayb = $return.preb
    $pro = ($return.pro -split " ")[0]
    $mem = ($return.mem -split " ")
    $newarraya = ($arraya -split " ") 
    $newarrayb = ($arrayb -split " ") 
    $pre = 0..($newarraya.Count - 1)

    for ($i = 0; $i -le ($newarraya.Count - 1); $i++) {
        $pre[$i] = ($newarrayb[$i] - $newarraya[$i]) / $zhouqi * 100 / $xc;
    }
    $preT = 0
    for ($n = 0; $n -le ($pre.Count - 1); $n++) {
        $tmp = $pre[$n]
        $preT += $tmp

    }
 
    $memT = 0
    for ($n = 0; $n -le ($mem.Count - 1); $n++) {
        $tmp = $mem[$n]
        $memT += $tmp

    }  
    $data[$m] = getData $memT $preT 
    $data[$m] #可註釋掉,用來顯示當前內存和CPU使用率
}

這段代碼主要解決的是系列進程問題,好比瀏覽器多開,VS code的多進程 最終得到$data就是咱們用於excel導出的數據

excel導出須要完整版office提供dom組件。

驗證方法

$excel = New-Object -ComObject Excel.Application 

未報錯便可

使用excel導出,首先須要利用com建立一個對象,而後添加sheet等;

$excel = New-Object -ComObject Excel.Application 
$workbook = $excel.Workbooks.add()
$sheet = $workbook.worksheets.Item(1)
$workbook.WorkSheets.item(1).Name = $pro 

而後利用以前的 $data數據進行excel導出,網上不少,這裏也很少說了

 1 $x = 2
 2 
 3 $lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type]
 4 $colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type]
 5 $borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type]
 6 $chartType = "microsoft.office.interop.excel.xlChartType" -as [type]
 7 
 8 for ($b = 1 ; $b -le 3 ; $b++) {
 9     $sheet.cells.item(1, $b).font.bold = $true
10     $sheet.cells.item(1, $b).borders.LineStyle = $lineStyle::xlDashDot
11     $sheet.cells.item(1, $b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic
12     $sheet.cells.item(1, $b).borders.weight = $borderWeight::xlMedium
13 }
14 
15 $sheet.cells.item(1, 1) = "title   time"
16 $sheet.cells.item(1, 2) = "WS memory(MB)"
17 $sheet.cells.item(1, 3) = "CPU(%)" 
18 
19 
20 foreach ($process in $data) {
21     $sheet.cells.item($x, 1) = $process.time
22     $sheet.cells.item($x, 2) = $process.mem/1024/1024
23     $sheet.cells.item($x, 3) = $process.pre
24 
25     $x++
26 } 
27 
28 $range = $sheet.usedRange
29 $range.EntireColumn.AutoFit() | out-null
30 $excel.Visible = $true
31 $filename= $appname+'-'+(Get-Date -Format 'MMddhhmm')+'.xlsx' #excel文件名
32 $excel.ActiveWorkBook.SaveAs($path+'/'+$filename)#保存excel
33 #$excel.quit()

最後將會得到一個三列$line+1行的excel  可使用excel的圖標和函數功能來分析數據。

ps:語文十幾年沒及格的,隨便寫寫!

附上github地址:https://github.com/aswezxqcc/ProcessesCount

分享一點,得到一點。

相關文章
相關標籤/搜索