根据属性计数将对象子集向下传递到管道?

时间:2018-10-23 09:40:49

标签: powershell

我需要在PowerCLI中编写一些脚本(VMWare连接到PowerShell的螺栓)。基本上,我们有一个包含三个主机的服务器集群。每个主机都有多个虚拟交换机。每个虚拟交换机都有多个VLAN(在VMWare中称为“端口组”)。我需要审核每个主机上都存在相同端口组的事实(因此,如果移动了VM,一切都会继续进行。)

要实现这一目标的第一步是要知道端口组名称存在于三台主机中的每台。

我正在研究如何根据从那些对象的属性返回的结果数从cmdlet返回的所有对象中筛选出一些对象。然后,我需要对通过过滤器测试的原始对象类型执行进一步的操作,以继续进行下去。

为了提供一些细节,此示例显示“某些端口组名称”及其存在的三个主机(另外,vSwitch):

Get-VirtualPortGroup -Name 'Some PortGroup Name' |
    Select-Object Name, VMHostID, VirtualSwitchId

产生输出

Name                VMHostId              VirtualSwitchId
----                --------              ---------------
Some PortGroup Name HostSystem-host-29459 key-vim.host.VirtualSwitch-vSwitch6
Some PortGroup Name HostSystem-host-29463 key-vim.host.VirtualSwitch-vSwitch6
Some PortGroup Name HostSystem-host-29471 key-vim.host.VirtualSwitch-vSwitch6

从3开始,我从Get-VirtualPortGroup返回的1849端口组名称开始。我需要一个管道来将VirtualPortGroup对象的数量减少到仅由'VMHostId'属性的计数小于3的那些对象组成的集合,然后将剩余的VirtualPortGroup对象向下传递给管道以进行进一步处理。

这似乎很简单。我仍然失败了。

以下内容几乎可以使用。对其进行度量显示的计数为229,而不是原始的1849(因此,它肯定被过滤掉了很多,并且可能正确地返回了我追寻的子集...?)。问题在于,对象类型现在是管道中的“组”或某种东西,并且不具有原始Get-VirtualPortGroup对象的所有属性和方法。

Get-VirtualPortGroup |
    Group-Object -Property Name |
    Where-Object $_.Count -lt 3

| Select-Object -ExpandProperty Group插到上面的末尾似乎很有希望,只是它似乎返回了整个Get-VirtualPortGroup对象的集合,就像我根本没有在其中进行过滤一样。...

我从根本上做错了吗?

如何根据对象的特定属性返回的结果数过滤掉对象,但仍将原始对象类型传递给管道?

1 个答案:

答案 0 :(得分:3)

您的方法是正确的,但是您弄错了Where-Object语法。缩写语法为:

Where-Object <property> <op> <value>

没有当前对象变量($_)。在您的情况下,将是:

Where-Object Count -lt 3

否则,您必须使用脚本块符号:

Where-Object { $_.Count -lt 3 }

这应该做您想要的:

Get-VirtualPortGroup |
    Group-Object -Property Name |
    Where-Object { $_.Count -lt 3 } |
    Select-Object -Expand Group