Powershell объединяет данные из массива в объект

Я хочу получить данные из 2 команд и объединить их в 1 объект. Моя цель - получить использование и стоимость Партнерский центр. Для этого я получил использование и стоимость с помощью команды Get-PartnerCustomerSubscriptionUsageМодуль партнерского центра. Но когда я получаю информацию о моем клиенте/подписке, я получаю уродливый ResourceID внутри своего отчета. А это непрезентабельно. Вот почему мне нужно получить настоящее имя ресурса, а не имя ресурса, предоставленное командой Get-PartnerCustomerSubscriptionUsage.

Покопавшись в документации, у меня появилась идея получить ResourceUri, у которого есть полный uri, такой как /subscription/xxxxx/Resourcegroup/xxxx/ms.vm/Имя, которое я хочу в своем отчете. Это значение имеет команда: Get-PartnerCustomerSubscriptionUtilization. Итак, я догадался, что я просто отказываюсь от Get-PartnerCustomerSubscriptionUsage и вместо этого использую PartnerCustomerSubscriptionUtilization, но у этого нет общей стоимости ресурса Azure.

Окей, держись со мной, проблема нарастает.

Итак, теперь я создал сценарий Powershell, который будет запускать обе команды и объединять их внутри объекта Powershell, который будет экспортирован в csv. Я могу запустить одну команду, предоставив информацию из этого объекта команды в мой созданный пользовательский объект и экспортировав его в csv. Проблема начинается, когда я хочу объединить оба.

$Customers= Get-PartnerCustomer 
for ($i=0 ; $i -lt $Customers.length; $i ++){
    $subscription = Get-PartnerCustomerSubscription -CustomerId  $Customers[$i].CustomerId
    for ($j=0 ; $j -lt $subscription.length; $j ++){
        if ( $subscription[$j].UnitType -eq "Usage-based" )
        {
        #Create title in csv
        $customerId = $Customers[$i].CustomerId
        $customerName= $Customers[$i].Name
        $subscriptionId = $subscription[$j].SubscriptionId
        $subscriptionName = $subscription[$j].OfferName
        $usage = Get-PartnerCustomerSubscriptionUsage -CustomerId  $customerId  -SubscriptionId $subscriptionId
        #new object for the export excel
        $ExportExcel = New-Object -TypeName PSObject
        $array = New-Object -TypeName PSObject

                       $End=  (get-date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss-08:00")
                       $Start = (Get-Date).AddDays(-1).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss-08:00")
                       $util = Get-PartnerCustomerSubscriptionUtilization -CustomerId $customerId -SubscriptionId $subscriptionId  -StartDate $Start -EndDate $End -ShowDetails
                         for ($y=0 ; $y -lt $util.length; $y ++)
                         {
                            $array = [PSCustomObject][ordered]@{

                            "ResourceID"=$util[$y].Id
                            "ResourceName"=$util[$y].ResourceUri.OriginalString

                            } 

                         }

            for ($z=0 ; $z -lt $usage.length; $z ++)
            {
            $LastModifiedDate =  $usage[$z].LastModifiedDate.DateTime.ToString("yyyy-MM-dd")

                    if ( $LastModifiedDate -ge $Lastdate )
                    {

                        if ($usage[$z].ResourceId -eq $array[$z].ResourceID){
                          #Add-Member -InputObject $ExportExcel -MemberType NoteProperty -Name "Category" -Value $array[$z].ResourceName  -Force
                          **echo $array[$z].ResourceName**
                        }
                         Add-Member -InputObject $ExportExcel -MemberType NoteProperty -Name "Category" -Value $usage[$z].Category   -Force
                         Add-Member -InputObject $ExportExcel -MemberType NoteProperty -Name "QuantityUsed" -Value $usage[$z].QuantityUsed  -Force
                         Add-Member -InputObject $ExportExcel -MemberType NoteProperty -Name "ResourceId" -Value $usage[$z].ResourceId  -Force

                    }


            }


           $ExportExcel |  Export-Csv –append -Path "C:\$customername.csv" -NoTypeInformation

        }
    }
}

Как видите, я прочитал все из одной команды внутри объекта, а затем зациклился на другой. Как только идентификатор ресурса будет равен обеим командам, мне нужно добавить его в объект. (для тестирования я просто проверяю это с помощью эха) Эхо с ***** ничего не печатает. Поэтому я не могу получить какое-либо имя ресурса внутри моего CSV. Кто-нибудь знает, что я делаю неправильно. Где комбинация двух объектов терпит неудачу?

Похоже, что вы обновляете $array и $ExportExcel после каждой итерации цикла, перезаписывая переменные без сохранения их предыдущих значений. Это означает, что когда вы обращаетесь к этим переменным вне ваших циклов, они будут содержать только значения последней итерации каждого цикла.

AdminOfThings 18.02.2019 17:13
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
230
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто для улыбки, я сделал несколько правок. Не могли бы вы сообщить мне, улучшит ли это ситуацию?

$Customers= Get-PartnerCustomer 
for ($i=0 ; $i -lt $Customers.length; $i ++){
    $subscription = Get-PartnerCustomerSubscription -CustomerId  $Customers[$i].CustomerId
    for ($j=0 ; $j -lt $subscription.length; $j ++){
        if ( $subscription[$j].UnitType -eq "Usage-based" )
        {
        #Create title in csv
        $customerId = $Customers[$i].CustomerId
        $customerName= $Customers[$i].Name
        $subscriptionId = $subscription[$j].SubscriptionId
        $subscriptionName = $subscription[$j].OfferName
        $usage = Get-PartnerCustomerSubscriptionUsage -CustomerId  $customerId  -SubscriptionId $subscriptionId
        #new object for the export excel
        $ExportExcel = New-Object -TypeName PSObject
        $array = @()
                   $End=  (get-date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss-08:00")
                   $Start = (Get-Date).AddDays(-1).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss-08:00")
                   $util = Get-PartnerCustomerSubscriptionUtilization -CustomerId $customerId -SubscriptionId $subscriptionId  -StartDate $Start -EndDate $End -ShowDetails
                     for ($y=0 ; $y -lt $util.length; $y ++)
                     {
                        $array += [PSCustomObject][ordered]@{

                        "ResourceID"=$util[$y].Id
                        "ResourceName"=$util[$y].ResourceUri.OriginalString

                        } 

                     }

        for ($z=0 ; $z -lt $usage.length; $z ++)
        {
        $ExportExcel = New-Object -TypeName PSObject
        $LastModifiedDate =  $usage[$z].LastModifiedDate.DateTime.ToString("yyyy-MM-dd")

                if ( $LastModifiedDate -ge $Lastdate )
                {
                    if ($usage[$z].ResourceId -eq $array[$z].ResourceID){
                      #Add-Member -InputObject $ExportExcel -MemberType NoteProperty -Name "Category" -Value $array[$z].ResourceName  -Force
                      **echo $array[$z].ResourceName**
                    }
                     Add-Member -InputObject $ExportExcel -MemberType NoteProperty -Name "Category" -Value $usage[$z].Category   -Force
                     Add-Member -InputObject $ExportExcel -MemberType NoteProperty -Name "QuantityUsed" -Value $usage[$z].QuantityUsed  -Force
                     Add-Member -InputObject $ExportExcel -MemberType NoteProperty -Name "ResourceId" -Value $usage[$z].ResourceId  -Force
                     $ExportExcel |  Export-Csv –append -Path "C:\$customername.csv" -NoTypeInformation
                }


        }




    }
}
}

Я отредактировал строку ниже, чтобы сохранить все значения для каждой итерации цикла $y.

$array += [PSCustomObject][ordered]@{
          "ResourceID"=$util[$y].Id
          "ResourceName"=$util[$y].ResourceUri.OriginalString
          } 

Я добавил строку ниже, чтобы можно было создать новый объект $ExportExcel, чтобы принимать ваши новые добавления свойств во время цикла $z.

$ExportExcel = New-Object -TypeName PSObject

Я переместил строку экспорта CSV внутрь цикла $z, чтобы можно было зафиксировать каждую итерацию настройки свойств для $ExportExcel.

Я получил эту ошибку при развертывании вашего кода Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'. В строке $array += [PSCustomObject][ordered]@{

achahbar 18.02.2019 17:41

Другие вопросы по теме