如何实现PowerShell内存告警时进程列表的缩进格式化?
解决PowerShell内存检查脚本的进程列表缩进问题
问题根源
你当前通过Out-String将进程列表转为多行字符串后直接拼接输出,导致只有第一行会跟随日志前缀的格式,后续行没有统一缩进,最终格式混乱。
修复方案
通过对进程列表的每一行添加统一缩进,并优化输出逻辑,实现对齐效果:
完整修改代码
Function Get-Memory{ $CompObject = Get-CIMInstance -Class WIN32_OperatingSystem $Memory = ((($CompObject.TotalVisibleMemorySize - $CompObject.FreePhysicalMemory)*100)/ $CompObject.TotalVisibleMemorySize) $Memory.ToString("#.##") } # 获取Top5高内存进程 $highMemProcesses = Get-Process | Sort-Object -Property ws -Descending | Group-Object -Property ProcessName | Select-Object -First 5 Count, Name, @{Name='Memoryusage(Total)';Expression={'{0:N3}MB' -f (($_.Group | Measure-Object WorkingSet -Sum).Sum / 1MB)}} # 给进程列表每行添加缩进(8个空格,与日志前缀对齐) $highMemUsage = $highMemProcesses | Format-Table -AutoSize | Out-String | ForEach-Object { if ($_.Trim() -ne '') { " $_" } else { $_ } } # 转换为数值类型避免字符串比较错误 $ram = [double]Get-Memory if ($ram -ge 90) { Write-Host "[ MEMORY ] : [ FAIL ] : Server MEMORY utilization $($ram)%" Write-Host "[ MEMORY ] : [ INFO ] : Top 5 high memory utilization processes:" Write-Host $highMemUsage } elseif ($ram -gt 80 -and $ram -lt 90) { Write-Host "[ MEMORY ] : [ WARN ] : Server MEMORY utilization $($ram)%" Write-Host "[ MEMORY ] : [ INFO ] : Top 5 high memory utilization processes:" Write-Host $highMemUsage } else { Write-Host "[ MEMORY ] : [ GOOD ] : Server MEMORY utilization $($ram)%" }
关键修改点
- 修复类型比较问题:将
$ram转为[double]类型,避免原字符串类型导致的比较逻辑错误(比如字符串"90"和"85"的比较结果不符合预期) - 统一缩进处理:通过
ForEach-Object给进程列表的每一行非空内容添加8个空格缩进,与日志前缀的格式对齐 - 拆分输出结构:将进程列表的标题和内容分开输出,避免拼接时的格式错乱,让日志结构更清晰
最终效果示例
[ MEMORY ] : [ WARN ] : Server MEMORY utilization 85.23% [ MEMORY ] : [ INFO ] : Top 5 high memory utilization processes: Count Name Memoryusage(Total) ----- ---- ------------------ 3 chrome 1245.678MB 2 explorer 890.123MB 1 sqlservr 765.456MB 1 firefox 654.321MB 1 svchost 432.100MB
内容的提问来源于stack exchange,提问作者Faisal Mohammed
相关产品推荐
相关产品推荐

