Удалить поле SideIndicator из выходных данных объекта сравнения в powershell - PullRequest
1 голос
/ 26 февраля 2020

Я просто хочу использовать список серверов, возвращаемых из вывода объекта сравнения, и я получаю 2 столбца. InputObject и SideIndicator. InputObject имеет серверы, которые я хочу, и SideIndicator имеет «<=». Я пытался просто выбрать InputObject из переменной, используя точечные обозначения, но безуспешно. </p>

Как мне вернуть только значения InputObject и ничего больше?

токовый выход

$GetAllVMs = Get-VM
$AllVMNames = $GetAllVMs.Name
$TaggedVMs = $GetAllVMs | Get-NsxSecurityTagAssignment
$TaggedVMsNames = $TaggedVMs.VirtualMachine.Name

$testing = Compare-Object -ReferenceObject $AllVMNames -DifferenceObject $TaggedVMsNames | Where-Object {$_.SideIndicator -eq "<="} | Select-Object $_.InputObject | Sort-Object InputObject | Format-Table



$testing


InputObject                                                              SideIndicator
-----------                                                              -------------
server1                                                                  <=
server2                                                                  <=
server3                                                                  <=

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Самый простой способ *1002* для получения самих входных объектов - это с помощью переключателя -PassThru :

PS> Compare-Object 'server1', 'server2', 'server3' @() -PassThru
server1
server2
server3

Предостережение является то, что входные объекты по-прежнему украшены SideIndicator элементом NoteProperty (в отличие от обернутого в [pscustomobject] экземпляре с InputObject и SideIndicator prperties), используя ETS PowerShell (Extended Type System).

Как показано выше, это свойство не обязательно всплывает, но есть контексты, где оно появляется, например, когда вы сериализуете объекты через ConvertTo-Json например.

К сожалению, единственный способ избежать этого украшения - не использовать -PassThru и извлечь значение свойства InputObject из выходных данных [pscustomobject] экземпляры , что вы и пытались:

Я пытался просто выбрать InputObject из переменной, используя точечную запись, но безуспешно.

Доступ к свойству .InputObject для всех выходных объектов через перечисление членов работает работает:

# Test command that compares an array of strings to the empty array.
PS> (Compare-Object 'server1', 'server2', 'server3' @()).InputObject
server1
server2
server3

Если вы все равно планируете собрать все объекты в памяти, это подойдет и будет самым быстрым вариантом.

Только если требуется потоковая передача результатов по конвейеру (для обработки один за другим без накопления результатов в памяти), вам нужно передать по каналу ForEach-Object InputObject или Select-Object -ExpandProperty InputObject.

0 голосов
/ 26 февраля 2020

Вы должны направить вывод через Select-Object, например,

Get-MyServers | Compare-Object -ReferenceObject $refobj | Select-Object -ExpandProperty 'InputObject'

, где Get-MyServers - это имя командлета, который вы используете для получения имен серверов, а $ refobj - это объект, который вы используете. сравниваешь против. См https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...