使用PowerShell采集D盘性能计数器遇异常,求助排查
问题分析与解决方案
问题1:磁盘空间数值异常偏大
Win32_LogicalDisk返回的Size和FreeSpace单位是字节,直接输出会显示成超大数字,需要转换成GB/MB等常用单位才会直观准确。
问题2:性能计数器列显示System.Object[]
Get-WmiObject Win32_PerfFormattedData_PerfDisk_LogicalDisk会返回所有逻辑磁盘的性能数据,你没有过滤目标D盘,导致$perfCounters是一个对象数组,直接访问属性时就会返回数组而非单个值。
关于你提到的cooked values:Win32_PerfFormattedData_*系列类已经返回计算后的格式化值(即cooked值),不需要额外处理;如果使用Win32_PerfRawData_*类,才需要手动计算原始值得到最终结果。
修正后的代码
# 捕获D盘空间信息(转换为GB单位,保留2位小数) $diskInfo = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='D:'" | Select-Object @{Name='UsedSpaceGB'; Expression={[math]::Round(($_.Size - $_.FreeSpace)/1GB,2)}}, @{Name='FreeSpaceGB'; Expression={[math]::Round($_.FreeSpace/1GB,2)}} # 捕获D盘的性能计数器数据(过滤InstanceName为D:) $perfCounters = Get-WmiObject Win32_PerfFormattedData_PerfDisk_LogicalDisk -Filter "InstanceName='D:'" | Select-Object PercentDiskReadTime, PercentDiskTime, PercentDiskWriteTime, PercentFreeSpace, AvgDisksecPerRead, AvgDisksecPerWrite, DiskReadsPersec, DiskWritesPersec, FreeMegabytes, Timestamp # 创建自定义对象 $finalData = [PSCustomObject]@{ "Used Space (GB)" = $diskInfo.UsedSpaceGB "Free Space (GB)" = $diskInfo.FreeSpaceGB "% Disk Read Time" = $perfCounters.PercentDiskReadTime "% Disk Time" = $perfCounters.PercentDiskTime "% Disk Write Time" = $perfCounters.PercentDiskWriteTime "% Free Space" = $perfCounters.PercentFreeSpace "Avg. Disk sec/Read" = $perfCounters.AvgDisksecPerRead "Avg. Disk sec/Write" = $perfCounters.AvgDisksecPerWrite "Disk Reads/sec" = $perfCounters.DiskReadsPersec "Disk Writes/sec" = $perfCounters.DiskWritesPersec "Free Megabytes" = $perfCounters.FreeMegabytes "DateTime" = $perfCounters.Timestamp } # 导出到CSV $finalData | Export-Csv -Path "C:\myburger.csv" -NoTypeInformation
关键改进点
- 磁盘单位转换:用
/1GB将字节转换为GB,通过[math]::Round()保留2位小数,让数值更直观易读。 - 过滤性能计数器:添加
-Filter "InstanceName='D:'"只获取D盘的性能数据,避免返回数组导致的System.Object[]问题。 - 属性命名优化:将磁盘空间属性名改为带单位的名称,避免歧义。
可选:改用更现代的CIM命令
如果你的PowerShell版本较新,推荐使用Get-CimInstance替代Get-WmiObject(WMI已被CIM取代,更高效稳定),替换后的代码兼容性更好:
# 改用Get-CimInstance的版本 $diskInfo = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='D:'" | Select-Object @{Name='UsedSpaceGB'; Expression={[math]::Round(($_.Size - $_.FreeSpace)/1GB,2)}}, @{Name='FreeSpaceGB'; Expression={[math]::Round($_.FreeSpace/1GB,2)}} $perfCounters = Get-CimInstance Win32_PerfFormattedData_PerfDisk_LogicalDisk -Filter "InstanceName='D:'" | Select-Object PercentDiskReadTime, PercentDiskTime, PercentDiskWriteTime, PercentFreeSpace, AvgDisksecPerRead, AvgDisksecPerWrite, DiskReadsPersec, DiskWritesPersec, FreeMegabytes, Timestamp
内容的提问来源于stack exchange,提问作者NanoNet
相关产品推荐
相关产品推荐

