在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
分享一點,得到一點。