当我听说 cool properties and methods MSDN 上的 PSObject
,我认为试用它们会很酷。
这就是我所做的:
首先,我创建了一个 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 告诉我,我的对象是 PSCustomObject
的种类 (TypeName
) 而不是 PSObject
。 PSCustomObject
并没有所有这些很酷的成员。
但我不希望 $plainObj
成为一种 PSCustomObject
- 我希望它成为一种 PSObject
。
我的问题:
为什么
$plainObj
是一种PSCustomObject
虽然我明确地 在$plainObj New-Object PSObject
中使用PSObject
作为-TypeName
? 有什么想法吗?如何让
$plainObj
成为一种PSObject
而不是一种PSCustomObject
?
@RussC Even if I use your script - that's the result:
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 Now I managed to create an object which is not kind of
PSCustomObject
:PS .> New-Object Object
But even then, I'm not able to create a
PSObject
(with aBaseObject
property and so on):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()
最佳答案
我相信它没有什么可报告的,因为它没有包装任何东西。
如果您创建一个新的 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 类迭代大量对象的情况下: Custom object gotchas
关于.net - 如何在 PowerShell 中创建 `PSObject`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941186/