Powershell - 加入多个命令

Powershell - Join multiple commands

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

您在 Get-MsolAccountSku 之后的 foreach 块从不输出任何内容,但它总是在每次迭代时覆盖 $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
}

感谢@Mathias R. Jessen,这是现在可以正常工作的完整代码:

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