You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:32:02