扩展要在管道中使用的对象

时间:2016-01-12 21:23:47

标签: powershell vmware powercli pscmdlet

我想扩展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中具有一些扩展功能并将这些值传递给管道?

2 个答案:

答案 0 :(得分: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 :(得分: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!
}