2017-04-11 12 views
0

現在、PowerShellを使用して複数のパートナーテナントでOffice 365のライセンスカウントを自動化しようとしています。いくつかの修正を加えた"サブアレイ"を使用したアレイのエクスポート

(インターネットから後天性)私の現在のコードは、私にこの出力を与える:

 
Column A  Column B  Column C 
--------  --------  -------- 
CustA  LicA,LicB 1,3 
CustB  LicA,LicB 7,3 
CustC  LicA   4 

しかし、私はこのコードから必要な出力は次のとおりです。

 
Column A  Column B  Column C 
--------  --------  -------- 
CustA  LicA   1 
      LicB   3 
CustB  LicA   7 
      LicB   3 

ここに私の現在のコードです

$tenantID = (Get-MsolPartnerContract).tenantid   

foreach($i in $tenantID){ 
    $tenantName = Get-MsolPartnerInformation -TenantId $i 
    $tenantLicense = Get-MsolSubscription -TenantId $i 
    $properties = [ordered]@{ 
     'Company' = ($tenantName.PartnerCompanyName -join ',') 
     'License' = ($tenantLicense.SkuPartNumber -join ',') 
     'LicenseCount' = ($tenantLicense.TotalLicenses -join ',') 
    } 

    $obj = New-Object -TypeName psobject -Property $properties 
    Write-Output $obj 
} 

私はワットに沿って、これを試してみました:Export-Csv -NoTypeを使用してエクスポートされていますi番目のすべてがcatastophically失敗コードのいくつかの他の反復:

$properties = [ordered]@{ 
    'Company' = ($tenantName.PartnerCompanyName -join ','), 
    @{'License' = ($tenantLicense.SkuPartNumber -join ',')}, 
    @{'LicenseCount' = ($tenantLicense.TotalLicenses -join',')} 
} 

私は「サブアレイ」$tenantLicense.SkuPartnumber$tenantLicense.TotalLicensesをすることについて考えていたが、私はオブジェクトに追加でこれをアプローチする方法が非常にわからないんだけど「メイン配列」と呼ばれる。

答えて

1

$tenantLIcenseの2番目のループは、あなたのためのトリックを行う必要があります。私はあなたのような環境にアクセスできないので、これをテストすることはできません。

$tenantID | ForEach-Object{ 
    $tenantName = Get-MsolPartnerInformation -TenantId $_ 
    $tenantLicense = Get-MsolSubscription -TenantId $_ 

    # Make an object for each $tenantLicense 
    $tenantLicense | ForEach-Object{ 
     $properties = [ordered]@{ 
      'Company' = $tenantName.PartnerCompanyName 
      'License' = $_.SkuPartNumber 
      'LicenseCount' = $_.TotalLicenses 
     } 

     # Send the new object down the pipe. 
     New-Object -TypeName psobject -Property $properties 
    } 
} 

あなたは同じ会社名は、それらの上にちょうどループをすることができますし、出力に同じ会社名を使用する必要があり、複数の$tenantLicensesを持っているので。これが成功したと仮定すると、それ以降の行で会社を省略するロジックがないので、希望する出力と同じ出力は得られません。私はそれがあなたがデータ/理解の損失を伴わずにデータを並べ替えることができるので、この方が良いと主張します。

通知foreach()ForEach-Objectに変更します。これにより、オブジェクトをパイプの下に送る方が簡単になります。

+0

フィードバックをいただきありがとうございました。 ForEach-Object関数とあなたのソリューションが本当にシンプルであることを知らない私のコードをied、また良い答えであり、私はあなたがこれを投稿するまで最初にこの質問を投稿した時から私のコードを読んでおく必要があるヒントを与えました。エラー。 – Joakim

0

コードソリューションを提供することなく、私はあなたが配列を構築する必要があると言うことができます。 プログラミングに関しては、配列ARRAY1を反復し、別の行ARRAY2に余分な行を移入する必要があります。たとえば、列AとBが単純な値で、Cが3つの項目の配列である場合、A,B,C1,A,B,C2A,B,C3の3つの行を新しい表に追加します。ループの各反復で、すべての順列を計算する必要があります。たとえば、あなたの場合はcolumnBとcolumnCによって生成されたものです。

これはForEach-Objectコマンドレットを使用したパイプライン処理でも可能ですが、これは難しく、Powershellとの比較的新しい関係について言及したように、私はこの経路を追求しません。

+0

こんにちは、私は配列を作ろうとしました、これは私がそれをした方法です。しかし、私はそれから期待される出力を得ることができません ? =バッククォート '@lisensantall = @() foreachの($ tenantLicense.TotalLicensesで$ LisensA) {$ Lisensantall + = $ LisensA } $プロパティ= [順序付け] @ { '会社' =($ tenantName .PartnerCompanyName -join "?n") 'License' =($ Lisenser -Jinin "?n") 'LicenseCount' =($ Lisensantall -join "?N ") } $ OBJ =新オブジェクト-TypeName psobject -Property $ properties' これからの復帰は、それらの中にこの カンパニーライセンスLicenesecount 名LICA .... 1 ..... – Joakim

+0

のようなものです1つのライセンスだけを保有するアレイは正常に表示され、いくつかのライセンスを含むアレイは、実際に第2のライセンスを新しい行に表示するのではなく、「...」と表示されます。 – Joakim

+0

@Mattによる解決策を見つけてうれしく思います。明確にすると、ForEach-Objectは他のループと同じです。パイプ実行とは基本的な違いがありますが、それは進んでいますが、あなたにとっては同じことになるでしょう –

関連する問題