#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. При этом исходный код получает 02. Удалите
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
}