我有一个模块,它执行“获取”操作并从 VMware 主机返回一些信息。所有返回信息都在 NoteProperty 中。我想在该 PSObject 中添加一个类型,以便我可以将其导入“set”cmdlet 并通过 ValueFromPipelineByPropertyName 继承该属性。
尝试做这样的事:
$obj = new-object PSObject
$obj | Add-Member Noteproperty -Name DataStoreName -value 'MYDATASTORE'
$obj | Add-Member ??? -Name VmHost -value $vmhost
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()
DataStoreName NoteProperty System.String DataStoreName=MYDATASTORE
VmHost ????? VMware.VimAutomation.ViCore.Impl.V1.Inventory.VMHostImpl
其中 VMware.VimAutomation.ViCore.Impl.V1.Inventory.VMHostImpl 代表来自 VMware PowerCli cmdlet 的“get-vmhost”的结果。
我希望用户能够访问 $obj.DatastoreName,它只是一个 NoteProperty,或者一些更高级的东西,比如 $obj.VmHost.ExtensionData.OverallStatus,它是我从 Powercli 获得的 $vmhost 对象的属性。
我一直在寻找,但无法弄清楚如何将特定对象类型添加到现有的 PSobject 属性中。
谢谢,
本
答案1
关于如何让 PowerShell 使用特定类型的问题非常简单,因为如果您已经可以通过 NoteProperty 提供提供所需类型的命令的结果,则您无需执行任何操作。
因此,在您的示例中,根据$vmHost
结果填充,Get-VMHost
您可以执行以下操作之一:
$obj = new-object PSObject
$obj | Add-Member NoteProperty -Name DataStoreName -value 'MYDATASTORE'
$obj | Add-Member NoteProperty -Name VmHost -value $vmhost
或者
$obj = New-Object PSObject -Property @{ DataStoreName = 'MYDATASTORE'; VmHost = $vmHost; }
如果 $vmHost 变量的类型还不正确,那么您需要在添加 NoteProperty 之前转换/强制类型或运行可获取类型的命令。
希望有所帮助。