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
}
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
}