如何将PowerShell中$processMemoryUsage变量输出记录到日志?
问题解决:PowerShell对象无法写入日志文件的处理方案
问题根源
$processMemoryUsage是通过Select-Object生成的自定义对象集合(PSCustomObject数组),直接将其与字符串拼接或写入文件时,PowerShell不会自动采用控制台的表格格式化输出,而是输出对象的默认字符串表示(比如System.Management.Automation.PSCustomObject),所以日志里看不到预期的内存数据。Write-Host能在控制台显示表格是因为控制台会自动对对象应用格式化规则,但写入文件时没有这个处理流程。
解决方案
方法1:将对象转为控制台格式的字符串(推荐)
使用Out-String命令把对象集合转换成和控制台输出一致的字符串,再写入日志。修改后的核心代码如下:
# 建议用Get-CimInstance替代已弃用的Get-WmiObject $processMemoryUsage = Get-CimInstance WIN32_PROCESS | Sort-Object -Property ws -Descending | Select-Object -first 5 processname, @{Name="Mem Usage(MB)";Expression={[math]::round($_.ws / 1mb*1.7)}}, @{Name="Mem Usage(%)";Expression={[math]::round($_.ws / 1mb*1.7)/100}} $currentTime = Get-Date -format "dd-MMM-yyyy HH:mm:ss" Write-Host "Util is ok of test" $logfilepath="C:\Users\lapasaca\Downloads\Memorylog.txt" # 将对象转为格式化字符串,再组合时间信息 $processStr = $processMemoryUsage | Out-String $logmessage = "=== $currentTime ==`n$processStr`n" $logmessage >> $logfilepath
方法2:自定义单行记录格式
如果不需要表格,而是要每行一条结构化记录,可以遍历对象拼接字符串:
$processMemoryUsage = Get-CimInstance WIN32_PROCESS | Sort-Object -Property ws -Descending | Select-Object -first 5 processname, @{Name="Mem Usage(MB)";Expression={[math]::round($_.ws / 1mb*1.7)}}, @{Name="Mem Usage(%)";Expression={[math]::round($_.ws / 1mb*1.7)/100}} $currentTime = Get-Date -format "dd-MMM-yyyy HH:mm:ss" Write-Host "Util is ok of test" $logfilepath="C:\Users\lapasaca\Downloads\Memorylog.txt" # 写入时间标记 "=== $currentTime ===" >> $logfilepath # 遍历每个进程对象,拼接自定义格式的字符串 foreach ($proc in $processMemoryUsage) { "$($proc.processname) | 内存占用(MB): $($proc.'Mem Usage(MB)') | 内存占比(%): $($proc.'Mem Usage(%)')" >> $logfilepath } "" >> $logfilepath # 空行分隔不同时间的记录
修改后日志示例(方法1)
=== 05-Oct-2024 14:30:00 == ProcessName Mem Usage(MB) Mem Usage(%) ----------- ------------- ------------ OUTLOOK.EXE 1368 13.68 Memory Compression 628 6.28 Teams.exe 582 5.82 msedge.exe 569 5.69 chrome.exe 548 5.48
内容的提问来源于stack exchange,提问作者Vida Vida
相关产品推荐
相关产品推荐

