以及如何访问嵌入式对象?

时间:2019-03-27 20:31:43

标签: powershell

我正在尝试创建一个报告,在其中提取数据并想在其他地方进行比较。我可以访问大多数数据,但不能访问嵌入式数据。我试图弄清楚,但需要一些帮助。

以下内容使我陷入困境。我希望能够成对地拉,例如。

合同规定的受保护数据大小(TB)和12.0

所以我知道有一个配对,但不知道如何寻址或访问它。我知道我可以做类似的事情。所以... $_.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 个答案:

答案 0 :(得分:0)

因此,您拥有的是一个对象,其中属性的值是一个对象数组。您要如何输出?您可以使用head创建一个基于源对象定义属性的自定义对象,也可以在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}} 格式构造了属性,其中较短的“ l”表示“标签”,而较短的“ e”表示“表达式”。

@{label='Property Name';expression={Property Value}}方法:

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