如何在PowerShell中创建`PSObject`

时间:2012-06-07 23:19:36

标签: .net shell powershell

当我在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

我的问题:

  • 为什么PSCustomObjectPSObject,虽然我明确指出 在-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}}

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/

希望这有帮助!