實際上,我們可以通過PowerShell來獲取性能計數器的值,比如當計算機可用內存小於500MB時,則自動發送郵件告警。
在PowerShell中,並沒有專門的命令來獲取性能計數器的值,也無法直接發送郵件,都需要先創建.Net Framework類的實例。
1)獲取性能計數器代碼如下:
#新建性能計數器對象 $counter = New-Object Diagnostics.PerformanceCounter #添加計數器,此處監視內存性能 $counter.CategoryName = "Memory" #添加計數器屬性值,此處監視可用內存 $counter.CounterName = "Available MBytes" #獲取當前計數器的值 $value = $counter.NextValue() |
2)發送郵件代碼如下:
#定義SMTP服務器地址,發件人賬戶及其密碼 $smtpServer = "smtp.163.com" $smtpUser = "sender@163.com" $smtpPassword = "mypasswd"
$mail = New-Object System.Net.Mail.MailMessage #定義發件人郵箱地址、收件人郵箱地址 $MailAddress="sender@163.com" $MailtoAddress="receiver@126.com" $mail.From = New-Object System.Net.Mail.MailAddress($MailAddress) $mail.To.Add($MailtoAddress)
#定義郵件標題、優先級和正文 $mail.Subject = "警報"; $mail.Priority = "High" $mail.Body = "PowerShell發送郵件測試!" |
完整的代碼如下:
#添加性能計數器 $counter = New-Object Diagnostics.PerformanceCounter $counter.CategoryName = "Memory" $counter.CounterName = "Available MBytes" $value = $counter.NextValue() #設置預設閥值 $prevalue = 500
#定義SMTP服務器地址,發件人賬戶及其密碼 $smtpServer = "smtp.163.com" $smtpUser = "sender@163.com" $smtpPassword = "mypasswd"
$mail = New-Object System.Net.Mail.MailMessage #定義發件人郵箱地址、收件人郵箱地址 $MailAddress="sender@163.com" $MailtoAddress="receiver@qq.com" $mail.From = New-Object System.Net.Mail.MailAddress($MailAddress) $mail.To.Add($MailtoAddress)
#定義郵件標題、優先級和正文 $mail.Subject = "警報"; $mail.Priority = "High" $mail.Body = "XX值已達到$value,已超出預設閥值$prevalue!"
#判斷是否超過預設閥值,如超出則發郵件報警 If ( $value -gt $prevalue) { $smtp = New-Object System.Net.Mail.SmtpClient -argumentList $smtpServer $smtp.Credentials = New-Object System.Net.NetworkCredential -argumentList $smtpUser,$smtpPassword $smtp.Send($mail) } |
===============================================
#查看當前CPU利用率
1 $counter = New-Object Diagnostics.PerformanceCounter 2 3 $counter.CategoryName = "Processor" 4 5 $counter.CounterName = "% Processor Time" 6 7 $counter.InstanceName = "_Total" 8 9 while ($true) 10 11 { 12 13 $value = $counter.NextValue() 14 15 Write-Host "CPU: $value" 16 17 sleep 1 18 19 }
#查看進程的CPU利用率:
1 #取CPU核心數量,如果計算機為多核心的話,Process/% Processor Time的結果為每個核心的CPU利用率之和,會大於100% 2 $cpus = (gwmi win32_computersystem).NumberOfLogicalProcessors 3 4 $counter = New-Object Diagnostics.PerformanceCounter 5 $counter.CategoryName = "Process" 6 $counter.CounterName = "% Processor Time" 7 $counter.InstanceName = "winrar" #定義需要監視的進程 8 #獲取當前計數器的值 9 $counter.NextValue()/$cpus
NumberOfCores:表示CPU核心數
NumberOfLogicalProcessors:表示CPU線程數
#查看進程的內存使用情況:
1 $TotalMemory = (Get-WmiObject -Class Win32_PhysicalMemory |measure capacity -sum).Sum #(gwmi win32_computersystem).TotalPhysicalMemory 2 3 $counter = New-Object Diagnostics.PerformanceCounter 4 $counter.CategoryName = "Process" 5 $counter.CounterName = "Working Set - Private" 6 $counter.InstanceName = "ZQErpService" #定義需要監視的進程 7 #獲取當前計數器的值 8 9 $counter.NextValue()/$TotalMemory