3

当我在 MSDN 上听说了s的很酷的属性和方法PSObject时,我想试试看会很酷。

这就是我所做的:

首先,我创建了一个新的 type 实例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 告诉我我的对象是 kind ( TypeName)PSCustomObject而不是PSObject。并且PSCustomObject没有所有这些很酷的成员。

但我不想$plainObj成为一种PSCustomObject——我希望它成为一种PSObject

我的问题:

  • 为什么是$plainObj一种PSCustomObject虽然我明确使用PSObjectas -TypeNameat $plainObj New-Object PSObject?任何想法?

  • 我怎样才能$plainObj成为一种PSObject而不是一种PSCustomObject


@RussC即使我使用你的脚本 - 结果就是:

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

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()
4

1 回答 1

2

我相信它没有什么可报告的,因为它没有包装任何东西。

如果您创建一个新的PSObject而不包装另一个对象或提供任何默认成员,那么它将创建一个PSCustomObject

正如 MSDN 对 PSCustomObject 的陈述:“用作在使用没有参数的 PSObject 构造函数时使用的占位符对象。”

例如,如果您这样做:

$plainObj = New-Object PSObject -property @{ title = 'fridojet' }
$plainObj | Add-Member -MemberType NoteProperty -Name Colour -Value Blue

那么 $plainObj 应该是一个 PSObject。

由于 PSObject 是一个静态转换调用,

$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。

然而,这些属性和方法的优势无论如何都是值得怀疑的。使用 PSObject 包装器的主要原因是当您在大量 .NET 类中传递对象时。

如果你只是在实验上做,那么它不会给你任何你不知道的东西。

这篇博文展示了使用 PSObject 的一些原因,尤其是在通过 .NET 类迭代大量对象的情况下:自定义对象陷阱

于 2012-06-07T23:35:09.097 回答