.net 如何在PowerShell中创建“PSObject”

.net 如何在PowerShell中创建“PSObject”,.net,shell,powershell,.net,Shell,Powershell,当我听说MSDN上的PSObjects时,我想尝试一下会很酷 我就是这么做的: 首先,我创建了一个类型为PSObject的新实例 然后,我寻找所有那些使用(但他们不在那里)的酷成员: 问题是: 没有BaseObject属性,也没有AsPSObject()方法。所有的酷会员都不在。但是为什么呢 Get成员告诉我,我的对象是PSCustomObject的类型(TypeName),而不是PSObject。而且,PSCustomObject没有所有这些很酷的成员 但是我不希望$plainObj成为一种P

当我听说MSDN上的
PSObject
s时,我想尝试一下会很酷

我就是这么做的: 首先,我创建了一个类型为
PSObject
的新实例

然后,我寻找所有那些使用(但他们不在那里)的酷成员:

问题是: 没有
BaseObject
属性,也没有
AsPSObject()
方法。所有的酷会员都不在。但是为什么呢

Get成员告诉我,我的对象是
PSCustomObject
的类型(
TypeName
),而不是
PSObject
。而且,
PSCustomObject
没有所有这些很酷的成员

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

我的问题是:
  • 为什么
    $plainObj
    是一种
    PSCustomObject
    ,尽管我 使用
    PSObject
    作为
    -TypeName
    $plainObj新对象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
属性等等):


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

如果创建新的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)

另一方面,BaseObject返回PSObject的基类。 使用上面的第二个示例:

$obj = New-Object object -property @{ title = "fridojet" }
$pso = PSObject.AsPSObject($obj)
$end = $pso.BaseObject
在这种情况下,$end应该是一个对象;不是PSObject;如果您使用Get Date one$end应该是DateTime类型

我希望使用此方法将实际返回PSObject的类型,而不是PSCustomObject

然而,这些属性和方法的优势是值得怀疑的;使用PSObject包装器的主要原因是当您在许多.Net类中传递对象时。 如果你只是做实验,那么它不会给你任何你还不知道的东西

本博客介绍了使用PSObject的一些原因,特别是在通过.Net类迭代大量对象的场景中:


希望这有帮助

谢谢你的回答。我已经尝试过类似的东西,但它是并且仍然是一个
PSCustomObject
。还有其他想法吗?附言:我已经测试了你的脚本,并且在我的答案的末尾发布了你脚本结果的一些细节。你在
$obj=New object
object
-property@{
(…)
中所说的
对象是什么意思?是否有特殊含义,或者
对象
只是
类型名
的占位符?我可以这样使用
AsPSObject()
$pso=[PSObject]::AsPSObject($plainobj)
。但是,即使我显式地使用
AsPSObject()
强制转换方法来获得
PSObject
:AsPSObject()
的结果也是一个
PSCustomObject
!W-T-F?!?。。。我在问题文本的底部添加了一些相关信息:虽然,现在我能够创建一个对象,它实际上不是
PSCustomObject
,我无法创建
PSObject
。您能告诉我们您实际使用的是哪种方法吗?@RussC这是什么意思?您的问题表明您“听说过很酷的属性和方法”;我想知道您是否想要测试任何特定的属性?您的意思是:“我是使用
-property
还是使用
addmember
向我的对象添加属性?”-然后我的回答是:我使用这两个属性-首先,我使用
-property
添加
标题
属性,然后使用
添加成员
添加
颜色
属性。我刚记下你答案的密码。。。。哦,现在我明白你的意思了不,不是只有一个特定的,但是我认为
AsPSObject()
方法和
BaseObject
属性是最有趣的。
$date = Get-Date
$pso = PSObject.AsPSObject($date)
$obj = New-Object object -property @{ title = "fridojet" }
$pso = PSObject.AsPSObject($obj)
$obj = New-Object object -property @{ title = "fridojet" }
$pso = PSObject.AsPSObject($obj)
$end = $pso.BaseObject