首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PowerShell中创建“`PSObject`”

如何在PowerShell中创建“`PSObject`”
EN

Stack Overflow用户
提问于 2012-06-07 23:19:35
回答 1查看 8.7K关注 0票数 3

当我听说MSDN上的冷性能和方法 of PSObjects时,我认为尝试它们是很酷的。

我就是这么做的:

首先,我创建了一个PSObject类型的新实例。

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

代码语言:javascript
复制
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成员告诉我,我的对象是TypeName( PSCustomObject )而不是PSObject。而PSCustomObject没有所有这些酷成员。

但我不想让$plainObj成为一种PSCustomObject --我希望它是一种PSObject

我的问题:

  • 为什么$plainObj是一种PSCustomObject,尽管我在$plainObj New-Object PSObject中显式地使用了PSObject作为-TypeName?有什么想法吗?
  • 我如何才能让$plainObj成为一种PSObject而不是一种PSCustomObject

@RussC,即使我使用了您的脚本--这就是结果: PS .> $plainObj =新对象PSObject -property @{ title = 'fridojet‘};加入-成员$plainobj -MemberType NoteProperty -Name Colour -Value .> -Value.> $plainObj TypeName: System.Management.Automation.PSCustomObject Name MemberType Definition?

@RussC现在我设法创建了一个不属于PSCustomObject的对象: PS .>新对象 但即使如此,我也无法创建一个PSObject (带有BaseObject属性等等): PS .> PSObject::AsPSObject((新对象对象))\x Get成员TypeName: System.Object Name MemberType定义

EN

回答 1

Stack Overflow用户

发布于 2012-06-07 23:35:09

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

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

正如MSDN对PSCustomObject的声明:“充当占位符对象,当使用没有参数的PSObject构造函数时使用。”

例如,如果您这样做:

代码语言:javascript
复制
$plainObj = New-Object PSObject -property @{ title = 'fridojet' }
$plainObj | Add-Member -MemberType NoteProperty -Name Colour -Value Blue

那么$plainObj应该是PSObject。

因为PSObject是一个静态的转换调用,

代码语言:javascript
复制
$date = Get-Date
$pso = PSObject.AsPSObject($date)

代码语言:javascript
复制
$obj = New-Object object -property @{ title = "fridojet" }
$pso = PSObject.AsPSObject($obj)

另一方面,BaseObject返回PSObject的基本类型。

使用上面的第二个例子:

代码语言:javascript
复制
$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类迭代许多对象的场景中:http://cjoprey.wordpress.com/archived/custom-object-gotchas/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10941186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档