首页/系统/Windows 运维速查/PSCustomObject 自定义对象
PowerShell 基础66 条

PSCustomObject 自定义对象

用 [pscustomobject]@{} 快速构造结构化对象:输出表格美观,且能直接导出 CSV/JSON,替代拼字符串输出。

Windows 运维速查系统更新于 2026-10-13

PSCustomObject 是什么

[pscustomobject]@{...} 是 PowerShell 里手工构造结构化对象的最短写法:给一组属性名与值,得到一个带类型标签的普通对象。它带来的好处是后续能继续管道给 Select-Object、Sort-Object、Export-Csv、ConvertTo-Json,而用 Write-Host 拼出来的文本什么也做不了。写巡检脚本、把散落的数据整理成报表时,这是从“打印信息”升级到“产出数据”的分界线。

基本信息

适用平台PowerShell 3.0 起支持 [pscustomobject] 字面量
语法[pscustomobject]@{ 属性1=值1; 属性2=值2 }
优势保留属性书写顺序,显示为表格,可直接导出 CSV/JSON
替代写法New-Object PSObject -Property(5.1 下顺序可能打乱)
批量构造循环里把对象收集成数组再统一输出或导出
计算属性Select-Object 的 @{n='名';e={表达式}} 也能造列

典型使用场景

  • 巡检脚本汇总每台机器的关键指标,导出 CSV 归档
  • 把命令输出的零散字段整理成固定结构,方便后续筛选排序
  • 写自定义函数时返回对象而不是字符串,便于调用方处理
  • 做资产清单:主机名、IP、系统版本、补丁级别一次列全
  • 给日志分析结果加上自定义列,配合格式命令输出报表

常用示例

常用示例
[pscustomobject]@{ 服务='Spooler'; 状态='Running' }                     # 最简写法
$rows = foreach ($s in Get-Service) { [pscustomobject]@{ 名称=$s.Name; 状态=$s.Status; 启动类型=$s.StartType } }
$rows | Where-Object 状态 -eq 'Running' | Sort-Object 名称              # 结果能继续管道计算
$rows | Export-Csv D:\svc.csv -NoTypeInformation -Encoding UTF8        # 导出成标准 CSV
$rows | ConvertTo-Json -Depth 3 | Out-File D:\svc.json -Encoding UTF8  # 或转 JSON
Get-Service | Select-Object -First 3 @{n='名称';e={$_.Name}}, @{n='状态';e={$_.Status}}   # 计算属性造列

写法对照

写法属性顺序适用场景
[pscustomobject]@{}按书写顺序保留首选,输出整齐
New-Object PSObject -Property @{}5.1 下可能乱序兼容老脚本
Select-Object @{n=;e=}按列出顺序从已有对象派生新列
PSCustomObject 类型加速器同字面量需要显式类型时
在循环里逐个 Write-Host 输出看着直观,但没有可消费的数据结构;想被别人复用或归档,就在循环里收集对象、循环结束后统一 Select 或 Export。
自定义对象里的敏感字段(连接串、口令、令牌)不要直接导出 CSV 或 JSON,脱敏或改用哈希指纹,导出文件往往会被随手共享。

易错点

  • 在 PowerShell 5.1 用 New-Object 构造对象,属性顺序可能与书写顺序不一致,报表列序混乱
  • 把复杂表达式直接塞进哈希表里嵌套引号,容易语法错误,先算好放进变量再赋值
  • 用 Write-Host 输出结果导致无法再管道处理,只能靠截图交差
  • 对象里带敏感字段就整体导出,等于把凭据写进了可分享的文件

数据来源与参考

  • Microsoft Learn:about_PSCustomObject

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌