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,脱敏或改用哈希指纹,导出文件往往会被随手共享。