首页 > 解决方案 > Powershell - 加入多个命令

问题描述

Get-MsolSubscription 为我提供了许可证总数

$Result=""   
$Results=@()   
$Subscriptions= Get-MsolSubscription | foreach{
 $SubscriptionName=$_.SKUPartNumber
 $SubscribedOn=$_.DateCreated
 $ExpiryDate=$_.NextLifeCycleDate
 $Status=$_.Status
 $TotalLicenses=$_.TotalLicenses
 $Result=@{'Subscription Name'=$SubscriptionName;'Total Licenses'=$TotalLicenses}
 $Results+= New-Object PSObject -Property $Result
 }

上面的代码工作正常,现在我想将上面命令的输出与 Get-MsolAccountSku 的输出结合起来,因为该命令给了我实际使用的许可证的数量

所以我修改了代码如下:

$Result=""   
$Results=@()   
$Subscriptions= Get-MsolSubscription | foreach{
 $SubscriptionName=$_.SKUPartNumber
 $SubscribedOn=$_.DateCreated
 $ExpiryDate=$_.NextLifeCycleDate
 $Status=$_.Status
 $TotalLicenses=$_.TotalLicenses
 $consumedLicences = Get-MsolAccountSku | foreach {
  $consumed = $_.ConsumedUnits
  $name = $_.SkuPartNumber
  } | where {$_.name -like $SubscriptionName }
 $Result=@{'Subscription Name'=$SubscriptionName;'Total Licenses'=$TotalLicenses;'Used'=$consumed}
 $Results+= New-Object PSObject -Property $Result
 }

问题是对于所有许可证,我都为已使用的列获得相同的值

Total Licenses Subscription Name              Used
-------------- -----------------              ----
            48 VISIOCLIENT                       9
            16 VISIOCLIENT                       9
         10000 STREAM                            9
            50 EMSPREMIUM                        9
         10000 POWERAPPS_INDIVIDUAL_USER         9

标签: powershelloffice365

解决方案


你的foreachGet-MsolAccountSku永远不会输出任何东西,但它总是$consumed在每次迭代时覆盖 - 因此重复计数。

将其更改为:

$Results = Get-MsolSubscription | ForEach-Object {
    # Get the part number and total licenses
    $SubscriptionName = $_.SKUPartNumber
    $TotalLicenses = $_.TotalLicenses

    # Count used licenses
    $consumedLicences = Get-MsolAccountSku | Where-Object {
        $_.SKUPartNumber -like $SubscriptionName
    } | ForEach-Object {
        $_.ConsumedUnits
    } |Measure-Object -Sum |Select-Object -Expand Sum
    
    # Output resulting object 
    [PSCustomObject]@{
        'Subscription Name' = $SubscriptionName
        'Total Licenses' = $TotalLicenses
        'Used' = $consumedLicences
    }
}

我冒昧地在这个过程中稍微简化了你的代码,但它的实质是这样的:

$consumedLicences = Get-MsolAccountSku | Where-Object {
    $_.SKUPartNumber -like $SubscriptionName
} | ForEach-Object {
    $_.ConsumedUnits
} |Measure-Object -Sum |Select-Object -Expand Sum

Where-Object 在这里,我们在执行任何其他操作之前应用过滤- 而来自的每个输出对象Get-MsolAccountSku仍然具有完整的属性。然后我们ForEach-Object用来提取 的值ConsumedUnits,最后我们用来Measure-Object对所有计数求和(我不清楚是否Get-MsolAccountSku |Where-Object ...会导致多个匹配)。

如果只有一个,您可以保持原样(一个值的总和就是它自己的值),或者您可以ForEach-Object { ... }完全删除所有内容:

$consumedLicences = Get-MsolAccountSku | Where-Object {
    $_.SKUPartNumber -like $SubscriptionName
} | ForEach-Object {
    $_.ConsumedUnits
}

推荐阅读