我正在尝试创建一个报告,在其中提取数据并想在其他地方进行比较。我可以访问大多数数据,但不能访问嵌入式数据。我试图弄清楚,但需要一些帮助。
以下内容使我陷入困境。我希望能够成对地拉,例如。
合同规定的受保护数据大小(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}...}
答案 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