2016-01-12 7 views
0

我想扩展VMware PowerCli cmdlet Get-VM以在其字段中输入我的值并将其传递给管道。扩展要在管道中使用的对象

例如,我想在对象中看到MyField1MyField2。这可以通过ps1xml文件来实现。

PS C:\> get-vm -name linux1 | fl * 


MyField1    : #value1# 
MyField2    : #value2# 
PowerState    : PoweredOff 
Version     : v8 
Description    : 
Notes     : 
Guest     : suse11sp3-3:SUSE Linux Enterprise 11 (64-bit) 
... 
... 

当我尝试使用管道中的字段时,我什么也得不到。

PS C:\> get-vm -name linux1 | other-cmdlet {$_.MyField1} 

例如,在这里我将使用Select-Object cmdlet的,但这些是什么:

PS C:\> get-vm -name linux1 | other-cmdlet {$_.MyField1} 
    $_.MyField 
    ---------- 

我怎样才能真正延伸的对象,在我的情况VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl有一些扩展功能,并通过这些值去管道?

+0

我忘了补充说MyField1和MyField2不是静态的,而是保存了我写的pscmdlet的值 – Cowabunga

回答

1

您可以使用Add-Member cmdlet。例如:

$VM = get-vm -name linux1 
$VM | Add-Member -MemberType NoteProperty -Name MyField1 -Value "#value#" 

$VM | Select * | fl 

更新:然后使用为其他值的cmdlet:

other-cmdlet $($VM | Select -ExpandProperty MyField1) 
1

Calculated properties很可能在PowerShell中添加自定义属性对象的最常用的方式:

Get-Vm -Name linux1 | 
    Select-Object *, @{n='MyField1';e={Some-Cmdlet ...}}, 
       @{n='MyField2';e={Other-Cmdlet ...}} 

另一种选择是使用Add-Member作为@ST8Z6FR57ABE6A8RE9UF建议:

Get-Vm -Name linux1 | ForEach-Object { 
    $_ | Add-Member -MemberType NoteProperty -Name MyField1 -Value (Some-Cmdlet ...) 
    $_ | Add-Member -MemberType NoteProperty -Name MyField2 -Value (Other-Cmdlet ...) 
    $_ # this line is required to actually output the modified object! 
}