当我在MSDN上听说PSObject
PSObject
时,我认为尝试它们会很酷。
首先,我创建了一个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()
类型的新实例。
然后我使用cool properties and methods寻找所有那些很酷的成员(但他们不在那里):
BaseObject
没有AsPSObject()
属性 - 也没有TypeName
方法。所有很酷的成员都不在那里。但为什么呢?
Get-Member告诉我,我的对象是PSCustomObject
而非PSObject
的善意(PSCustomObject
)。 $plainObj
没有所有这些很酷的成员。
但我不希望PSCustomObject
成为一种PSObject
- 我希望它是一种$plainObj
。
为什么PSCustomObject
是PSObject
,虽然我明确指出
在-TypeName
使用$plainObj New-Object PSObject
作为$plainObj
?
有什么想法吗?
如何让PSObject
成为某种PSCustomObject
而不是PS .> $plainObj = New-Object PSObject -property @{ title = 'fridojet' };
$plainObj | Add-Member -MemberType NoteProperty -Name Colour -Value Blue
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()
Colour NoteProperty System.String Colour=Blue
title NoteProperty System.String title=fridojet
?
@RussC 即使我使用你的脚本 - 这就是结果:
PSCustomObject
@RussC 现在我设法创建了一个不属于
PS .> New-Object Object
的对象:PSObject
但即便如此,我也无法创建
BaseObject
(具有PS .> [PSObject]::AsPSObject((New-Object Object)) | Get-Member TypeName: System.Object Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString()
属性等等):{{1}}
答案 0 :(得分:2)
我认为没有什么可报告的,因为它没有包装任何东西。
如果您创建一个新的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应该是一个Object;不是PSObject;如果您使用Get-Date之一; $ end应该是DateTime类型。
我希望使用此方法实际上会返回一种PSObject,而不是PSCustomObject。
然而,无论如何,这些属性和方法的优点是可疑的;使用PSOject包装器的主要原因是当你在很多.Net类中传递对象时。 如果你只是通过实验进行,那么它就不会给你任何你不知道的东西。
此博客显示了使用PSObject的一些原因,特别是在您通过.Net类迭代大量对象的情况下:http://cjoprey.wordpress.com/archived/custom-object-gotchas/
希望这有帮助!