Powershell将数组中的数据组合到对象中

时间:2019-02-18 16:03:55

标签: arrays powershell object

我想从2个命令中获取数据并将它们组合成1个对象。 我的目标是获得Partner center的使用率和成本。为此,我使用了Partner center module中的命令Get-PartnerCustomerSubscriptionUsage来获得用法和成本。但是,当我检索到客户/订阅的信息时,我的报表中出现了难看的ResourceID。而且这是不可行的。这就是为什么我需要获取真实的ResourceName而不是Get-PartnerCustomerSubscriptionUsage命令随附的资源名称的原因。

在仔细阅读了文档之后,我想到了一个检索具有整个uri的ResourceUri的想法,例如/subscription/xxxxx/Resourcegroup/xxxx/ms.vm/ 我想要在报告中使用的名称 >。具有该值的命令是:Get-PartnerCustomerSubscriptionUtilization。因此,我猜想我只是放弃了Get-PartnerCustomerSubscriptionUsage并改用PartnerCustomerSubscriptionUtilization,但是这个没有每一种天蓝色资源的总成本。

好的,我坚持下去,问题已经到了。

因此,现在我创建了一个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

        }
    }
}

如您所见,我已经从一个对象中的一个命令读取了所有内容,然后遍历了另一个命令。一旦两个命令的resourceID相等,我需要将其添加到Object。 (为了进行测试,我只是使用回声进行测试) 带*****的回显不打印任何内容。所以我无法在csv中获取任何Resourcename。有谁知道我在做什么错。这两个对象的组合在哪里失败?

1 个答案:

答案 0 :(得分: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的每次设置属性迭代。