Powershell — объединение нескольких команд

#powershell #office365

#powershell #office365

Вопрос:

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
 

Ответ №1:

Ваш foreach блок after Get-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
}
 

Комментарии:

1. Спасибо за ваши усилия, мне не нужна сумма, просто нужно свойство ConsumedUnit для каждой лицензии, я изменил $consumedLicences = Get-MsolAccountSku | Where-Object { $_.Name -like $SubscriptionName } | ForEach-Object { $_.ConsumedUnits } | Select-Object -ExpandProperty ConsumedUnits и ничего не получаю в качестве выходных данных для consumedLicences. При этом исходный код получает 0

2. Удалите Select-Object -Expand... часть, она не нужна — поскольку мы разыменовываем $_.ConsumedUnits , выводом ForEach-Object является необработанное числовое значение. Другими словами, нет свойств для расширения

3. спасибо, теперь это работает, в вашем ответе была опечатка, я опубликую весь код в качестве другого ответа. Спасибо!

4. @overflowed Отлично! Пожалуйста, дайте мне знать, где опечатка (или предложите отредактировать мой ответ), чтобы ее можно было исправить 🙂

5. $_.Name -like $SubscriptionName должно быть $_.SkuPartNumber -like $SubscriptionName

Ответ №2:

Благодаря @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
 }