PowerShell 指令碼來監控 CPU、記憶體和磁碟使用情況:

suv789發表於2024-09-23

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
}

說明:

  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.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
}

執行和測試

確保在實際執行之前,修改相關的郵件配置和檔案路徑。你可以先在測試環境中執行這個指令碼,確保各項功能正常後再投入使用。

相關文章