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

PowerShell哈希表输出CSV格式化问题求助

嘿,我之前在写服务器监控脚本的时候也碰到过一模一样的CSV格式问题,尤其是处理多硬盘数据的时候,给你两个实用的解决方案,你可以根据自己的需求选:

方案1:将每个硬盘信息拆分为单独列

这个方案适合后续需要用Excel或其他工具单独分析每块硬盘数据的场景,把每块盘的容量、可用空间都做成独立的CSV列,比如HD_C_Total_GB、HD_C_Free_GB这种命名方式。

示例代码:

# 替换成你的远程服务器名称,多台的话可以改成数组循环
$serverName = "RemoteServer01"

# 采集CPU核心信息(取第一个处理器即可)
$cpu = Get-WmiObject -ComputerName $serverName -Class Win32_Processor | Select-Object -First 1
# 采集总内存(计算所有物理内存的总和)
$totalMemGB = [math]::Round((Get-WmiObject -ComputerName $serverName -Class Win32_PhysicalMemory | Measure-Object Capacity -Sum).Sum / 1GB, 2)
# 采集逻辑磁盘(过滤本地硬盘,DriveType=3)
$disks = Get-WmiObject -ComputerName $serverName -Class Win32_LogicalDisk -Filter "DriveType=3"

# 初始化基础信息对象
$serverStats = [PSCustomObject]@{
    ServerName       = $serverName
    CPU_Model        = $cpu.Name
    CPU_TotalCores   = $cpu.NumberOfCores
    Total_Memory_GB  = $totalMemGB
}

# 遍历每块磁盘,给对象添加对应列
foreach ($disk in $disks) {
    $driveLetter = $disk.DeviceID.TrimEnd(':')  # 去掉盘符的冒号,比如C:变成C
    # 添加总容量列
    $serverStats | Add-Member -MemberType NoteProperty -Name "HD_$($driveLetter)_Total_GB" -Value [math]::Round($disk.Size / 1GB, 2)
    # 添加可用空间列
    $serverStats | Add-Member -MemberType NoteProperty -Name "HD_$($driveLetter)_Free_GB" -Value [math]::Round($disk.FreeSpace / 1GB, 2)
}

# 导出CSV,指定UTF8编码避免乱码,去掉类型信息头
$serverStats | Export-Csv -Path "Server_Hardware_Info.csv" -NoTypeInformation -Encoding UTF8

这个方案的好处是CSV结构清晰,每块硬盘的数据独立,后续做数据筛选、统计非常方便。如果监控多台服务器,只要保证循环逻辑正确,脚本会自动根据第一台服务器的磁盘数量生成列,后续服务器缺少的磁盘列会填充null,不影响整体结构。

方案2:用自定义分隔符合并硬盘信息到单列

如果不需要单独分析每块硬盘,只是想紧凑存储数据,可以把同一服务器的所有硬盘信息用分隔符(比如分号、竖线)拼接成一个字符串,放在同一列里。

示例代码:

$serverName = "RemoteServer01"

$cpu = Get-WmiObject -ComputerName $serverName -Class Win32_Processor | Select-Object -First 1
$totalMemGB = [math]::Round((Get-WmiObject -ComputerName $serverName -Class Win32_PhysicalMemory | Measure-Object Capacity -Sum).Sum / 1GB, 2)
$disks = Get-WmiObject -ComputerName $serverName -Class Win32_LogicalDisk -Filter "DriveType=3"

# 把每块硬盘的信息拼接成字符串,用分号分隔
$diskSummary = $disks | ForEach-Object {
    "$($_.DeviceID) | Total: $([math]::Round($_.Size/1GB,2))GB | Free: $([math]::Round($_.FreeSpace/1GB,2))GB"
} -Join "; "

$serverStats = [PSCustomObject]@{
    ServerName       = $serverName
    CPU_Model        = $cpu.Name
    CPU_TotalCores   = $cpu.NumberOfCores
    Total_Memory_GB  = $totalMemGB
    Disk_Details     = $diskSummary
}

$serverStats | Export-Csv -Path "Server_Compact_Info.csv" -NoTypeInformation -Encoding UTF8

这种方式的CSV行数更少,数据紧凑。后续如果需要拆分硬盘数据,可以用PowerShell的-Split命令或者Excel的「文本分列」功能,指定你用的分隔符就能快速拆分。

额外注意点

  • 导出CSV时一定要加-Encoding UTF8,避免中文或特殊字符乱码;
  • 如果用Get-WmiObject觉得慢,可以换成更高效的Get-CimInstance(语法基本一致);
  • 多服务器循环时,建议先收集所有服务器的对象,再一次性导出CSV,这样效率更高。

内容的提问来源于stack exchange,提问作者user2176024

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:46:35