#自定义对象
PowerShell 允许创建自定义对象,用于组合来自不同来源的数据、为数据添加说明性属性,或生成便于导出为 JSON、CSV 的结构。
#使用 [pscustomobject] 创建对象
最常见的方式是将哈希表转换为 [pscustomobject]:
> $obj = [pscustomobject]@{ Name = 'demo'; Version = 1 }
> $obj
Name Version
---- -------
demo 1
使用 [ordered] 保持属性顺序:
> $obj = [pscustomobject][ordered]@{ Name = 'demo'; Version = 1 }
[pscustomobject]创建的属性类型为NoteProperty。- 属性值可以是字符串、数字、数组,甚至其他对象。
#使用 New-Object 创建对象
> $obj = New-Object -TypeName psobject -Property @{ Name = 'demo'; Version = 1 }
> $obj.Name
demo
-Property 接收一个哈希表,其中的键会成为对象的属性。
#使用 Add-Member 添加成员
Add-Member 可以向已有对象添加属性或方法:
> $obj = [pscustomobject]@{ Name = 'demo' }
> $obj | Add-Member -MemberType NoteProperty -Name Version -Value 1
> $obj.Version
1
- 默认情况下
Add-Member不输出对象;需要继续传递时使用-PassThru。 - 添加同名属性时可以使用
-Force覆盖。
#使用 Select-Object 计算属性创建对象
Select-Object 可以在投影的同时计算新属性:
> Get-Process | Select-Object -First 3 -Property ProcessName, @{ Name = 'MemMB'; Expression = { [math]::Round($_.WorkingSet64 / 1MB, 1) } }
这种方式适合从现有对象生成新的数据结构,而不需要手动逐个添加属性。
#转换为 JSON 和 CSV
自定义对象可以直接序列化:
> $obj | ConvertTo-Json
> $obj | ConvertTo-Csv -NoTypeInformation
> $obj | Export-Csv -Path ./obj.csv -NoTypeInformation
读取 JSON 或 CSV 后,也会得到具有相应属性的对象:
> Get-Content ./obj.json -Raw | ConvertFrom-Json
> Import-Csv -Path ./obj.csv
#注意事项
Add-Member会修改原对象,除非先复制对象。ConvertTo-Csv返回 CSV 文本,Export-Csv直接写入文件。- 导出的 CSV 可能不包含类型信息,具体取决于是否使用
-NoTypeInformation。