PowerShell:使用PSCustomObject处理MsolUser属性遇许可证数据缺失问题
问题修正与优化方案
错误原因
你脚本里的LicenseSKU字段语法错误,$msUser.{$_.licenses.accountskuid}这种写法不符合PowerShell对象属性访问规则,导致无法正确提取许可证SKU。另外,Licenses是一个集合(用户可能有多个许可证),需要处理多值场景。
修正后的基础脚本
Import-CSV -Path "C:\Temp\users.csv" | ForEach-Object { $msUser = Get-MsolUser -UserPrincipalName $_.UserPrincipalName [PSCustomObject]@{ UserPrincipalName = $msUser.UserPrincipalName DisplayName = $msUser.FullName IsLicensed = $msUser.IsLicensed LicenseSKU = $msUser.Licenses.AccountSkuId -join ', ' } } | Export-CSV -Path "C:\temp\output.csv" -Append -NoTypeInformation
关键修正点
- 把错误的
$msUser.{$_.licenses.accountskuid}改为$msUser.Licenses.AccountSkuId,直接访问用户对象的许可证集合属性 - 用
-join ', '将多个许可证SKU合并为字符串,避免CSV导出时显示为数组类型
更简便的实现方法
可以省略中间变量,直接通过管道串联操作,同时利用Select-Object自定义输出属性,代码更简洁:
Import-CSV -Path "C:\Temp\users.csv" | ForEach-Object { Get-MsolUser -UserPrincipalName $_.UserPrincipalName } | Select-Object UserPrincipalName, @{Name='DisplayName'; Expression={$_.FullName}}, IsLicensed, @{Name='LicenseSKU'; Expression={$_.Licenses.AccountSkuId -join ', '}} | Export-CSV -Path "C:\temp\output.csv" -NoTypeInformation
优势
- 减少变量声明,代码更紧凑
- 利用
Select-Object的计算属性直接构造输出列,逻辑更清晰 - 去掉
-Append(如果不需要追加到现有文件),默认覆盖输出文件,避免重复数据
内容的提问来源于stack exchange,提问作者mannyfresh86
相关产品推荐
相关产品推荐

