PowerShell 脚本来监控 CPU、内存和磁盘使用情况:

news/2024/9/23 5:48:13

PowerShell 脚本来监控 CPU、内存和磁盘使用情况:

powershellCopy Code
# 获取CPU使用率
$cpu = Get-Counter '\Processor(_Total)\% Processor Time'# 获取内存使用情况
$mem = Get-WmiObject Win32_OperatingSystem
$memUsage = [math]::round((($mem.TotalVisibleMemorySize - $mem.FreePhysicalMemory) / $mem.TotalVisibleMemorySize) * 100, 2)# 获取磁盘使用情况
$disk = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 }
$diskUsage = foreach ($d in $disk) {[pscustomobject]@{Drive = $d.DeviceIDUsedSpace = [math]::round(($d.Size - $d.FreeSpace) / 1GB, 2)FreeSpace = [math]::round($d.FreeSpace / 1GB, 2)}
}# 输出监控结果
"CPU Usage: $($cpu.CounterSamples.CookedValue)%"
"Memory Usage: $memUsage%"
$diskUsage | Format-Table -AutoSize

运行这个脚本将显示 CPU 使用率、内存使用率和磁盘使用情况。


增强这个脚本,使其定期运行并记录性能数据到日志文件中。以下是一个示例:

powershellCopy Code
# 设置日志文件路径
$logFilePath = "C:\PerformanceLog.txt"# 定义监控间隔(秒)
$monitorInterval = 60# 创建一个无限循环进行监控
while ($true) {# 获取 CPU 使用率$cpu = Get-Counter '\Processor(_Total)\% Processor Time'# 获取内存使用情况$mem = Get-WmiObject Win32_OperatingSystem$memUsage = [math]::round((($mem.TotalVisibleMemorySize - $mem.FreePhysicalMemory) / $mem.TotalVisibleMemorySize) * 100, 2)# 获取磁盘使用情况$disk = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 }$diskUsage = foreach ($d in $disk) {[pscustomobject]@{Drive = $d.DeviceIDUsedSpace = [math]::round(($d.Size - $d.FreeSpace) / 1GB, 2)FreeSpace = [math]::round($d.FreeSpace / 1GB, 2)}}# 获取当前时间$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"# 记录结果到日志文件$logEntry = "$timestamp - CPU Usage: $($cpu.CounterSamples.CookedValue)%, Memory Usage: $memUsage%`n"$diskUsage | ForEach-Object {$logEntry += "Drive: $($_.Drive), Used Space: $($_.UsedSpace) GB, Free Space: $($_.FreeSpace) GB`n"}$logEntry += "`n"# 写入日志Add-Content -Path $logFilePath -Value $logEntry# 暂停指定的监控间隔Start-Sleep -Seconds $monitorInterval
}

说明:

  1. 日志文件路径:你可以根据需要更改 $logFilePath 的路径。
  2. 监控间隔$monitorInterval 定义了每次监控之间的时间间隔(单位为秒)。
  3. 无限循环:使用 while ($true) 创建一个无限循环,持续进行监控。
  4. 时间戳:每次记录时,会添加当前的时间戳,以便后续查阅。

运行脚本:

  1. 打开 PowerShell。
  2. 将脚本复制到一个 .ps1 文件中,例如 MonitorPerformance.ps1
  3. 右键单击 PowerShell 并选择“以管理员身份运行”。
  4. 运行脚本:.\MonitorPerformance.ps1

请确保你有权限写入日志文件的目录,并且脚本在执行期间不会被意外终止。


对脚本进行一些改进和扩展,以便更好地管理和分析性能数据。以下是一些建议:

1. 增强错误处理

可以增加错误处理,以确保在出现异常时,脚本不会崩溃:

powershellCopy Code
try {# 监控代码
} catch {$errorMessage = "Error: $_"Add-Content -Path $logFilePath -Value "$timestamp - $errorMessage`n"
}

2. 添加邮件通知功能

如果 CPU 或内存使用率超过某个阈值,可以通过邮件通知你。你可以使用 Send-MailMessage 命令发送电子邮件:

powershellCopy Code
# 设置阈值
$cpuThreshold = 80
$memThreshold = 80# 发送邮件的函数
function Send-AlertEmail {param ([string]$subject,[string]$body)Send-MailMessage -To "youremail@example.com" -From "monitor@example.com" -Subject $subject -Body $body -SmtpServer "smtp.example.com"
}# 在监控循环中检查阈值
if ($cpu.CounterSamples.CookedValue -gt $cpuThreshold) {Send-AlertEmail -subject "High CPU Usage Alert" -body "CPU usage is at $($cpu.CounterSamples.CookedValue)%."
}if ($memUsage -gt $memThreshold) {Send-AlertEmail -subject "High Memory Usage Alert" -body "Memory usage is at $memUsage%."
}

3. 将数据写入 CSV 文件

如果希望更方便地分析性能数据,可以将日志数据写入 CSV 文件:

powershellCopy Code
# 设置 CSV 文件路径
$csvFilePath = "C:\PerformanceLog.csv"# 添加标题(如果文件不存在)
if (-not (Test-Path $csvFilePath)) {"Timestamp,CPU Usage,Memory Usage,Drive,Used Space,Free Space" | Out-File -FilePath $csvFilePath
}# 记录数据到 CSV
foreach ($diskInfo in $diskUsage) {$csvEntry = "$timestamp,$($cpu.CounterSamples.CookedValue),$memUsage,$($diskInfo.Drive),$($diskInfo.UsedSpace),$($diskInfo.FreeSpace)"$csvEntry | Out-File -FilePath $csvFilePath -Append
}

4. 优化性能

如果你希望优化脚本的性能,可以使用更高效的方法来获取性能数据,比如减少调用 Get-WmiObject 的频率,或者只在特定条件下记录数据。

5. 可视化分析

可以考虑使用 Power BI 或 Excel 来可视化 CSV 文件中的数据,帮助更好地理解系统性能变化。

完整脚本示例

整合上述改进后的完整脚本如下:

powershellCopy Code
# 设置日志文件路径
$logFilePath = "C:\PerformanceLog.txt"
$csvFilePath = "C:\PerformanceLog.csv"# 设置阈值
$cpuThreshold = 80
$memThreshold = 80# 设置SMTP邮件服务器
$smtpServer = "smtp.example.com"
$emailTo = "youremail@example.com"
$emailFrom = "monitor@example.com"# 定义监控间隔(秒)
$monitorInterval = 60# 添加标题(如果文件不存在)
if (-not (Test-Path $csvFilePath)) {"Timestamp,CPU Usage,Memory Usage,Drive,Used Space,Free Space" | Out-File -FilePath $csvFilePath
}# 创建一个无限循环进行监控
while ($true) {try {# 获取 CPU 使用率$cpu = Get-Counter '\Processor(_Total)\% Processor Time'# 获取内存使用情况$mem = Get-WmiObject Win32_OperatingSystem$memUsage = [math]::round((($mem.TotalVisibleMemorySize - $mem.FreePhysicalMemory) / $mem.TotalVisibleMemorySize) * 100, 2)# 获取磁盘使用情况$disk = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 }$diskUsage = foreach ($d in $disk) {[pscustomobject]@{Drive = $d.DeviceIDUsedSpace = [math]::round(($d.Size - $d.FreeSpace) / 1GB, 2)FreeSpace = [math]::round($d.FreeSpace / 1GB, 2)}}# 获取当前时间$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"# 记录结果到日志文件$logEntry = "$timestamp - CPU Usage: $($cpu.CounterSamples.CookedValue)%, Memory Usage: $memUsage%`n"$diskUsage | ForEach-Object {$logEntry += "Drive: $($_.Drive), Used Space: $($_.UsedSpace) GB, Free Space: $($_.FreeSpace) GB`n"}$logEntry += "`n"Add-Content -Path $logFilePath -Value $logEntry# 写入数据到 CSVforeach ($diskInfo in $diskUsage) {$csvEntry = "$timestamp,$($cpu.CounterSamples.CookedValue),$memUsage,$($diskInfo.Drive),$($diskInfo.UsedSpace),$($diskInfo.FreeSpace)"$csvEntry | Out-File -FilePath $csvFilePath -Append}# 检查阈值并发送邮件if ($cpu.CounterSamples.CookedValue -gt $cpuThreshold) {Send-MailMessage -To $emailTo -From $emailFrom -Subject "High CPU Usage Alert" -Body "CPU usage is at $($cpu.CounterSamples.CookedValue)%." -SmtpServer $smtpServer}if ($memUsage -gt $memThreshold) {Send-MailMessage -To $emailTo -From $emailFrom -Subject "High Memory Usage Alert" -Body "Memory usage is at $memUsage%." -SmtpServer $smtpServer}} catch {$errorMessage = "Error: $_"Add-Content -Path $logFilePath -Value "$timestamp - $errorMessage`n"}# 暂停指定的监控间隔Start-Sleep -Seconds $monitorInterval
}

运行和测试

确保在实际运行之前,修改相关的邮件配置和文件路径。你可以先在测试环境中运行这个脚本,确保各项功能正常后再投入使用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/63595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

python-集合set

集合:可变数据类型,但是它里面的元素必须是不可变数据类型

Java代码审计篇 - ofcms系统审计思路讲解 - 篇2 - SQL注入漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计 1. 前言 我发现很多文章包括教程,大概套路是:只说有漏洞的点,将有漏洞的点指出,然后分析代码;或者黑盒测试出漏洞之后,然后分析代码。 我认为这是在分析漏洞代码,而非代码审计。代码审计文章或教程应该…

Java代码审计篇 - ofcms系统审计思路讲解 - 篇3 - 文件上传漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇3 | 文件上传漏洞审计 1 文件上传代码审计【有1处】 文件上传漏洞我们需要着重关注的是文件在被java代码解析到保存下来之间有无验证过滤,因此什么样的上传方式,什么样的保存方式都不重要,大家着重关注代码对文件的验证过滤手段…

Java代码审计篇 - ofcms系统审计思路讲解 - 篇4 - XXE漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计 1. XXE代码审计【有1处】 XXE代码审计常搜索的关键字如下: XMLReader SAXBuilder SAXReader SAXParserFactory Digester DocumentBuilderFactory ...还有一个特殊的,用于加载.jrxml 文件,这是 JasperReports 特…

Java反序列化利用链篇 | CC6链分析(通用版CC链)

CC6 CC6和CC1之间的区别 在CC1的LazyMap链中,调用链如下: AnnotationInvocationHandler.readObject() Map(Proxy).entrySet() LazyMap.get() ChainedTransformer.transform() InvokerTransformer.transform() Runtime.exec()而在CC1链中,对CommonsCollections和jdk版本是有限…

Java反序列化利用链篇 | CC3链分析、TemplatesImpl类中的调用链、TrAXFilter、InstantiateTransformer类的transform()【本系列文章的分析重点】

CC3链分析 1. CC3链背景 前面介绍了CC1和CC6,这两条链子虽然前面的入口类不同CC1入口类是AnnotationInvocationHandler CC6入口类是HashMap但是其触发恶意代码的方式是相同的,都是InvokerTransformer.transform()触发Runtime.getRuntime().exec()实现命令执行。而在很多情况下…

VUE学习day one

学习来源:【前端最新Vue2+Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!】https://www.bilibili.com/video/BV1HV4y1a7n4?vd_source=6dac49feb8d7fd76b147c8cf8c0c2b5a Vue是什么?Vue是一个用于构建用户界面(基于数据动态渲染出用户看到的页面)…

全网最适合入门的面向对象编程教程:51 Python 函数方法与接口-使用 Zope 实现接口

在 Python 中,Zope 提供了一种机制来定义和实现接口。Zope 的接口模块通常用于创建可重用的组件,并确保组件遵循特定的接口规范。全网最适合入门的面向对象编程教程:51 Python 函数方法与接口-使用 Zope 实现接口摘要: 在 Python 中,Zope 提供了一种机制来定义和实现接口。…