.net - 如何在 PowerShell 中创建 `PSObject`

标签 .net shell powershell

当我听说 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) 而不是 PSObjectPSCustomObject 并没有所有这些很酷的成员。

但我不希望 $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 a BaseObject 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/

相关文章:

c# - 解析前过滤LinqToExcel中的空白行(转换/映射)

.net - .NET 中究竟在什么情况下会抛出 SecurityException?

linux - 为什么我的 ffmpeg 进程在没有 subprocess.run 的 stdin 参数的情况下永远等待?

powershell - 内部逻辑的Powershell问题

powershell - 解析导入的csv并迭代管道值

powershell - 如何将命令数组传递给 dotnet cli 应用程序

c# - Silverlight 还是 WPF?

.net - 是否可以对复杂的声明进行建模(分层/嵌套/等)?

shell - 根据现有字段的值(sed 或 awk)在每行末尾添加新字段

json - 从 JSON 中提取字符串,而不在值周围创建文字引号