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.DeviceID
UsedSpace = [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.DeviceID
UsedSpace = [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
}
說明:
- 日誌檔案路徑:你可以根據需要更改
$logFilePath
的路徑。 - 監控間隔:
$monitorInterval
定義了每次監控之間的時間間隔(單位為秒)。 - 無限迴圈:使用
while ($true)
建立一個無限迴圈,持續進行監控。 - 時間戳:每次記錄時,會新增當前的時間戳,以便後續查閱。
執行指令碼:
- 開啟 PowerShell。
- 將指令碼複製到一個
.ps1
檔案中,例如MonitorPerformance.ps1
。 - 右鍵單擊 PowerShell 並選擇“以管理員身份執行”。
- 執行指令碼:
.\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.DeviceID
UsedSpace = [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
# 寫入資料到 CSV
foreach ($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
}
執行和測試
確保在實際執行之前,修改相關的郵件配置和檔案路徑。你可以先在測試環境中執行這個指令碼,確保各項功能正常後再投入使用。