Azure中按公司名称生成SKU统计表的PowerShell脚本故障排查
故障原因
批量执行失败的核心问题只有一处:
- 你在定义去重公司列表变量
$Company时,管道末尾加了Format-Table命令。这个命令会将原始的PowerShell对象转换为用于控制台显示的格式化输出对象,不再保留原始的Companyname属性值,后续循环里$F.Companyname实际取到的是空值,自然无法筛选出对应数据。
另外还有两个不影响运行但会干扰输出的小问题:
- 未过滤
Companyname为空的用户条目,循环时会额外生成一块无公司名的无效统计 -like匹配未使用通配符,实际效果和等值匹配一致,没有发挥模糊匹配的作用
修正后可直接运行的脚本
cls $Report = [System.Collections.Generic.List[Object]]::new() $Skus = Get-AzureADSubscribedSku | Select Sku*, ConsumedUnits ForEach ($Sku in $Skus) { Write-Host "Processing license holders for" $Sku.SkuPartNumber $SkuUsers = Get-AzureADUser -All $True | ? { $_.AssignedLicenses -Match $Sku.SkuId } ForEach ($User in $SkuUsers) { $ReportLine = [PSCustomObject] @{ User = $User.DisplayName UPN = $User.UserPrincipalName Companyname = $User.Companyname Country = $User.Country SKU = $Sku.SkuId SKUName = $Sku.SkuPartNumber } $Report.Add($ReportLine) } } # 采集去重公司名,移除空值,不要提前做格式化输出 $Company = $Report | Where-Object Companyname -ne $null | Select-Object Companyname -Unique # 逐公司生成SKU统计表格 Foreach ($F in $Company) { Write-Host "----------------------------------------------------" Write-Host "SKU's for $($F.Companyname)" $Report | Where-Object Companyname -eq $F.Companyname | Group-Object -Property SKU | Select-Object Count, Name, @{Name = 'SKUName' ; expression = { ($_.Group.SKUName) -join ', ' } } | Format-Table }
补充说明
- 修正后循环内的统计逻辑和你单独测试单公司的逻辑完全一致,输出的表格格式、字段和你单条执行的预期结果没有区别
- 如果确实需要模糊匹配公司名,把
Where-Object里的-eq换回-like,同时给匹配值加通配符即可,比如-like "*$($F.Companyname)*"
内容的提问来源于stack exchange,提问作者Elly
相关产品推荐
相关产品推荐

