#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
сокращенно) сообщит вам, какими свойствами и методами обладает объект и какие значения содержат эти свойства. Это должно дать вам некоторое представление о том, как получить доступ к свойствам. Некоторые из них просто методом проб и ошибок или просто опытом и распознаванием форматов вещей.