Передача подмножества объектов по конвейеру на основе количества свойств? - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно написать некоторые вещи в PowerCLI (болт VMWare в PowerShell).В основном у нас есть кластер серверов с тремя хостами.Каждый хост имеет несколько виртуальных коммутаторов.Каждый виртуальный коммутатор имеет несколько виртуальных сетей («группы портов» в VMWare говорят).Мне нужно проверить тот факт, что на каждом хосте существуют одинаковые группы портов (поэтому, если виртуальная машина перемещается, все работает).

Шаг 1 для достижения этой цели - узнать, что имя группы портов существует накаждая из трех хост-машин.

Я спорю о том, как отфильтровать некоторые объекты из всех, возвращаемых командлетом, на основе количества результатов, возвращаемых свойством этих объектов.Затем мне нужно выполнить дальнейшие операции с исходным типом объекта, который проходит тест фильтра, чтобы продолжить работу по конвейеру.

Чтобы дать некоторую конкретику, в этом примере показан «Некоторое имя группы портов» и три хоста, на которых он существует.(и в качестве бонуса 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 я начинаю с имен групп групп портов 1849, которые возвращаютсяGet-VirtualPortGroup.Мне нужен конвейер, чтобы свести число объектов 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 голосов
/ 23 октября 2018

Ваш подход верен, но вы неправильно набрали синтаксис 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...