Как получить доступ к встроенным объектам и?

#powershell

#powershell

Вопрос:

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

Приведенное ниже вводит меня в зацикливание. Я хочу иметь возможность извлекать, например, парами, например.

Сокращенный размер защищенных данных (ТБ) и 12.0

Итак, я понимаю, что есть сопряжение, но не знаю, как обратиться к. Я знаю, что могу сделать что-то вроде. So … $_.questions дает мне эти данные, но я знаю, как просто извлечь нужные мне пары.

 'Select-Object{$_.id,$_.name,$_.backupBillableSpaceGb,$_.company.name,$_.questions}'

id                     : 20221
name                   : LANVault Backup Profile
type                   : @{id=72; name=Backup Profile; _info=}
status                 : @{id=1; name=Active; _info=}
company                : @{id=15412; identifier=ACME, INC; name=ACME;             
_info=}
contact                : @{id=40760; name=Dave ROTH; _info=}
site                   : @{id=14657; name=Main; _info=}
locationId             : 2
businessUnitId         : 10
installationDate       : 2018-04-18T00:00:00Z
warrantyExpirationDate : 2019-04-18T00:00:00Z
billFlag               : True
backupSuccesses        : 0
backupIncomplete       : 0
backupFailed           : 0
backupRestores         : 0
backupBillableSpaceGb  : 0.00
backupYear             : 0
backupMonth            : 0
questions              : {@{answerId=131586; questionId=655; 
question=Contracted Protected Data Size (TB); answer=12.0; 
sequenceNumber=1.00; numberOfDecimals=1; fieldType=Number; 
requiredFlag=True},
@{answerId=131589; questionId=656; question=Contracted # of
Protected Servers; answer=2; sequenceNumber=2.00;
numberOfDecimals=0; fieldType=Number; requiredFlag=True},
@{answerId=131591; questionId=657; question=Additional
Protected Data Cost: ($/TB/Mo.); answer=300.0;
sequenceNumber=3.00; numberOfDecimals=0; fieldType=Currency;
requiredFlag=True}, @{answerId=131592; questionId=658;
question=Additional Server Cost: ($/Server/Mo.); answer=60.0;
sequenceNumber=4.00; numberOfDecimals=0; fieldType=Currency;
requiredFlag=True}...}
  

Ответ №1:

Итак, у вас есть объект, где значением свойства является массив объектов. Как вы хотите это вывести? Вы можете использовать Select-Object для создания пользовательского объекта, определяющего свойства на основе исходного объекта, или вы можете перебирать объекты в ForEach-Object цикле и создавать объекты таким образом. Я приведу примеры каждого из них.

Select-Object метод:

 $SourceObject | Select ID,name,backupBillableSpaceGb,@{l='CompanyName';e={$_.company.name}},@{l='Contracted Protected Data Size (TB)';e={$_.questions|Where{$_.question -eq 'Contracted Protected Data Size (TB)'}|Select -expand answer}}
  

Это приводит к чрезвычайно длинным длинам и становится действительно трудным для чтения, но при этом все это остается встроенным. В этих примерах я создавал свойства в @{label='Property Name';expression={Property Value}} формате, используя более короткие ‘l’ для ‘label’ и ‘e’ для ‘expression’.

ForEach-Object метод:

 $SourceObject | ForEach{
    [PSCustomObject]@{
        ID = $_.id
        Name = $_.name
        CompanyName = $_.company.name
        'Contracted Protected Data Size (TB)' = $_.questions|Where{$_.question -eq 'Contracted Protected Data Size (TB)'}|Select -expand answer
    }
    }
  

Это должно привести к тому же результату, но, как правило, его легче читать. Хотя это занимает намного больше места.

Однако у этого есть некоторые преимущества, такие как: если это становится очень медленным из-за необходимости многократного перебора $_.questions массива, вы могли бы создать хэш-таблицу из этого массива и ссылаться на нее, при желании.

 $SourceObject | ForEach{
    $QuestionsHT = @{}
    $_.questions | ForEach{$QuestionsHT.Add($_.question,$_.answer)}
    [PSCustomObject]@{
        ID = $_.id
        Name = $_.name
        CompanyName = $_.company.name
        'Contracted Protected Data Size (TB)' = $QuestionsHT.'Contracted Protected Data Size (TB)'
        'Additional Protected Data Cost: ($/TB/Mo.)' = $QuestionsHT.'Additional Protected Data Cost: ($/TB/Mo.)'
    }
    }
  

Комментарии:

1. Как мне узнать больше об этих типах объектов и как понять, как получить доступ к данным. Есть ли что-нибудь, что позволит мне передать объект и показать, как ссылаться на его свойства? Я пытался учиться на YouTube и сайтах, но они довольно простые.

2. Get-Member Командлет (или GM сокращенно) сообщит вам, какими свойствами и методами обладает объект и какие значения содержат эти свойства. Это должно дать вам некоторое представление о том, как получить доступ к свойствам. Некоторые из них просто методом проб и ошибок или просто опытом и распознаванием форматов вещей.