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