From the PSObject documentation:
包装一个对象,提供可用成员的替代视图以及扩展它们的方法。成员可以是方法、属性、参数化属性等。
换句话说,PSObject 是一个对象,您可以在创建它之后为其添加方法和属性。
From the "About Hash Tables" documentation:
哈希表,也称为字典或关联数组,是一种紧凑的数据结构,用于存储一个或多个键/值对。
...
哈希表经常被使用,因为它们对于查找和检索数据非常有效。
您可以像使用Hashtable 一样使用PSObject,因为PowerShell 允许您向PSObjects 添加属性,但您不应该这样做,因为您将无法访问Hashtable 特定功能,例如Keys 和 Values 属性。此外,可能会产生性能成本和额外的内存使用量。
The PowerShell documentation has the following information about PSCustomObject:
当使用 PSObject 的无参数构造函数时,用作占位符 BaseObject。
这对我来说并不清楚,但来自the co-author of a number of PowerShell books 的a post on a PowerShell forum 似乎更清楚:
[PSCustomObject] 是一个类型加速器。它构造了一个 PSObject,但这样做的方式是导致哈希表键成为属性。 PSCustomObject 本身不是一个对象类型——它是一个进程快捷方式。 ... PSCustomObject 是在没有构造函数参数的情况下调用 PSObject 时使用的占位符。
关于您的代码,@{a=1;b=2;c=3} 是 Hashtable。 [PSObject]@{a=1;b=2;c=3} 不会将 Hashtable 转换为 PSObject 或生成错误。该对象仍然是Hashtable。但是,[PSCustomObject]@{a=1;b=2;c=3} 将Hashtable 转换为PSObject。我找不到说明为什么会发生这种情况的文档。
如果您想将 Hashtable 转换为对象以便将其键用作属性名称,您可以使用以下代码行之一:
[PSCustomObject]@{a=1;b=2;c=3}
# OR
New-Object PSObject -Property @{a=1;b=2;c=3}
# NOTE: Both have the type PSCustomObject
如果您想将多个Hashtables 转换为一个对象,其中它们的键是属性名称,您可以使用以下代码:
@{name='a';num=1},@{name='b';num=2} |
% { [PSCustomObject]$_ }
# OR
@{name='a';num=1},@{name='b';num=2} |
% { New-Object PSObject -Property $_ }
<#
Outputs:
name num
---- ---
a 1
b 2
#>
很难找到有关 NoteProperty 的文档。 In the Add-Member documentation,没有任何-MemberType 对添加NoteProperty 以外的对象属性有意义。 Windows PowerShell Cookbook(第 3 版)将 Noteproperty Membertype 定义为:
由您提供的初始值定义的属性
- 李 H. (2013)。 Windows PowerShell 说明书。 O'Reilly Media, Inc. p。 895.