1

I want to get data from 2 commands and combine them into 1 object. My goal is to get usage and cost of the Partner center. To do this I got the usage and cost with the command Get-PartnerCustomerSubscriptionUsage of the Partner center module. But when i Retrieve information of my customer/subscription I got the ugly ResourceID inside my report. And this is not presentable. This is why I need to get the real ResourceName, not the Resource name that is provided with the Get-PartnerCustomerSubscriptionUsage command.

After some digging in the documentation I got an idea to retrieve the ResourceUri that has the entire uri like /subscription/xxxxx/Resourcegroup/xxxx/ms.vm/The name that i want in my report. The command that has this value is : Get-PartnerCustomerSubscriptionUtilization. So I guessed that I just ditch the Get-PartnerCustomerSubscriptionUsage and use the PartnerCustomerSubscriptionUtilization instead , but this one does not have the totalcost per azure Resource.

Oké hang on with me the problem is getting there.

So now I created a Powershell script that will run the both commands , and combine them inside an Powershell object that will be exported to a csv. I can get one command running , providing the info from that command object into my custom object that is created and export it to csv. The problem is starting when I want to combine the both.

$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

        }
    }
}

As you can see I've read everything from one command inside an object and then loop over the other one. Once the resourceID is equal over the both commands, I need to add it to the Object. (for testing I just test this with an echo) The echo with the ***** doesn't print anything. So I can't get any Resourcename inside my csv. Does anyone have a clue what I am doing wrong. Where the combination of the 2 objects fail ?

1
  • It appears that you are updating $array and $ExportExcel after each loop iteration by overwriting the variables without retaining their previous values. This means that when you access those variables outside of your loops, they will only contains values of the last iteration of each loop. Commented Feb 18, 2019 at 16:13

1 Answer 1

1

Just for grins, I've made a few edits. Can you let me know if this improves the situation?

$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
                }


        }




    }
}
}

I edited the line below to retain all values for each iteration of loop $y.

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

I added the line below so that a new $ExportExcel object could be created to accept your new property additions during loop $z.

$ExportExcel = New-Object -TypeName PSObject

I moved the CSV export line to inside of the $z loop so that each iteration of setting properties for $ExportExcel could be captured.

Sign up to request clarification or add additional context in comments.

1 Comment

I got this error when deploying your code Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'. At the line $array += [PSCustomObject][ordered]@{

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.