当我听说MSDN上PSObject
的cool properties and methods时,我想尝试一下会很不错。
那就是我所做的:
首先,我创建了一个类型为PSObject
的新实例。
然后,我使用Get-Member寻找了所有很酷的成员(但他们不在那里):
PS .> $plainObj = New-Object PSObject
PS .> $plainObj | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
问题:
没有
BaseObject
属性-也没有AsPSObject()
方法。所有很棒的成员都不在那里。但为什么?Get-Member告诉我,我的对象是
TypeName
的一种(PSCustomObject
)而不是PSObject
。而且PSCustomObject
没有所有这些很棒的成员。但是我不希望
$plainObj
是一种PSCustomObject
-我希望它是一种PSObject
。我的问题:
$plainObj
为什么是一种PSCustomObject
在PSObject
处将-TypeName
用作$plainObj New-Object PSObject
吗?任何的想法?
$plainObj
而不是PSObject
而不是PSCustomObject
? 最佳答案
我相信它没有什么可报告的,因为它没有包装任何东西。
如果在不包装另一个对象或不提供任何默认成员的情况下创建新的PSObject,则它将创建PSCustomObject。
正如MSDN为PSCustomObject指出的那样:“用作当使用不带参数的PSObject构造函数时使用的占位符对象。”
例如,如果执行此操作:
$plainObj = New-Object PSObject -property @{ title = 'fridojet' }
$plainObj | Add-Member -MemberType NoteProperty -Name Colour -Value Blue
然后$ plainObj应该是PSObject。
我不在Windows机器上,因此无法正确测试,因此请以一定剂量的盐服用,但希望对您有所帮助!
编辑:
仍在尝试寻找解决方案;但与此同时,我可以阐明一些想法。
(记住我是从内存中这样做的!)
AsPSObject是一个静态转换调用。
$date = Get-Date
$pso = PSObject.AsPSObject($date)
要么
$obj = New-Object object -property @{ title = "fridojet" }
$pso = PSObject.AsPSObject($obj)
另一方面,BaseObject返回PSObject的基类。
使用上面的第二个示例:
$obj = New-Object object -property @{ title = "fridojet" }
$pso = PSObject.AsPSObject($obj)
$end = $pso.BaseObject
在这种情况下,$ end应该是一个对象;不是PSObject;如果您使用Get-Date之一; $ end应该是DateTime类型。
我希望使用此方法将实际上返回一种PSObject,而不是PSCustomObject。
但是,这些特性和方法的优势还是值得怀疑的。使用PSOject包装器的主要原因是当您在许多.Net类周围传递对象时。
如果您只是通过实验进行操作,那么它不会给您带来您不知道的任何东西。
该博客显示了使用PSObject的一些原因,尤其是在通过.Net类迭代许多对象的情况下:http://cjoprey.wordpress.com/archived/custom-object-gotchas/
希望这可以帮助!