2016-01-12 33 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! 
}