有人能解释一下细节吗?如果我创建一个对象使用
$var = [PSObject]@{a=1;b=2;c=3}然后我使用getType() PowerShell查找它的类型,PowerShell告诉我它的类型是Hashtable。
当使用Get成员 (别名gm)检查对象时,显然已经创建了哈希表,因为它具有keys和values属性。那么,“普通”哈希表有什么区别呢?
另外,使用PSCustomObject的好处是什么?当使用这样的方法创建一个
$var = [PSCustomObject]@{a=1;b=2;c=3}对我来说,唯一明显的区别是PSCustomObject.的不同数据类型。另外,使用gm进行检查而不是键和值属性显示,现在每个键都被添加为NoteProperty对象。
但我有什么优势呢?我可以使用它的键来访问我的值,就像在哈希表中一样。我可以在PSCustomObject中存储更多的简单键值对(例如,键-对象对),就像在哈希表中一样。那么有什么好处呢?有什么重要的区别吗?
发布于 2018-05-06 05:52:12
包装一个对象,提供可用成员的备用视图和扩展它们的方法。成员可以是方法、属性、参数化属性等。
换句话说,PSObject是一个对象,您可以在创建它之后向它添加方法和属性。
哈希表(也称为字典或关联数组)是存储一个或多个键/值对的紧凑数据结构。 ..。 哈希表之所以经常使用,是因为它们在查找和检索数据方面非常有效。
您可以像使用PSObject一样使用Hashtable,因为PowerShell允许您向PSObjects添加属性,但是不应该这样做,因为您将失去对Hashtable特定功能的访问,例如Keys和Values属性。此外,可能会有性能成本和额外的内存使用。
当使用不带参数的PSObject构造函数时,充当占位符BaseObject。
我不清楚这一点,但来自许多PowerShell书籍的合著者的许多PowerShell书籍的合著者似乎更清楚:
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的文档。文档,除了NoteProperty之外,没有任何添加对象属性有意义的-MemberType。Windows PowerShell Cookbook (第3版)将Noteproperty Membertype定义为:
由您提供的初始值定义的属性。
发布于 2014-05-09 03:10:10
使用[PSCustomObject]而不是HashTable的一个场景是需要它们的集合。以下是说明如何处理它们的不同之处:
$Hash = 1..10 | %{ @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} }
$Custom = 1..10 | %{[PSCustomObject] @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} }
$Hash | Format-Table -AutoSize
$Custom | Format-Table -AutoSize
$Hash | Export-Csv .\Hash.csv -NoTypeInformation
$Custom | Export-Csv .\CustomObject.csv -NoTypeInformationFormat-Table将导致$Hash的以下结果
Name Value
---- -----
Name Object 1
Squared 1
Index 1
Name Object 2
Squared 4
Index 2
Name Object 3
Squared 9
...以及$CustomObject的以下内容
Name Index Squared
---- ----- -------
Object 1 1 1
Object 2 2 4
Object 3 3 9
Object 4 4 16
Object 5 5 25
...同样的事情发生在Export-Csv上,因此使用[PSCustomObject]而不是普通HashTable的原因。
发布于 2014-11-11 17:56:34
假设我想创建一个文件夹。如果我使用PSObject,您可以通过查看它来判断它是错误的。
PS > [PSObject] @{Path='foo'; Type='directory'}
Name Value
---- -----
Path foo
Type directory然而,PSCustomObject看起来是正确的
PS > [PSCustomObject] @{Path='foo'; Type='directory'}
Path Type
---- ----
foo directory然后,我可以对对象进行管道传输。
[PSCustomObject] @{Path='foo'; Type='directory'} | New-Itemhttps://stackoverflow.com/questions/14012773
复制相似问题