我们经常遇到使用Exchange Powershell去导出邮箱用户属性值到CSV文件中时,会出现某些属性值无法导出问题。
例如下面的例子:
========================================================================================================================
使用命令获取邮箱用户的EmailAddresses属性值,下面的命令能够将结果输出到屏幕。
Get-Mailbox | fl name,displayname,EmailAddresses
如果使用如下命令,将产生的结果使用Export-CSV导出到CSV文件中。生成的CSV文件中关于EmailAddresses列的值变成了一个不认识的值。
Get-Mailbox | Select-Object name,displayname,EmailAddresses | Export-Csv -Path c:\temp\x500-01.csv -NoTypeInformation -Encoding UTF8
======================================================================================================================
为什么会出现这样的情况?
======================================================================================================================
通过命令Get-Mailbox | fl name,displayname,EmailAddresses 输出的结果情况,我们了解到属性值EmailAddresses的值为{}即为多值属性,这种情况下使用Select-Object进行操作时将会出现这个在情况。发生这种情况时,我们需要使用一个数组来存储多值属性值,然后再进行导出。
=====================================================================================================================
解决方法
=====================================================================================================================
使用如下命令去实现上面命令需要实现的功能:
Get-Mailbox | Select-Object name,displayname,@{label='EmailAddresses';expression={$_.EmailAddresses -join ";"}} | Export-Csv -Path c:\temp\x500-02.csv -NoTypeInformation -Encoding UTF8
我们看到导出的CSV文件中EmailAddresses的属性值正常显示了。
上面命令能够成功达到目的,关键是由@{label='EmailAddresses';expression={$_.EmailAddresses -join ";"}} 起作用了。下面对该命令进行逐一说明:
@{ 表示将取出的数据使用一个数组来存储该属性值。
@{label=’EmailAddresses’ 表示为数组的列名称(可以使用name/label,可以简写为N/L),即CSV文件中的一个列名。
expression={$_.EmailAddresses 表示需要获取的数据对象(Expression可以简写为E)。(即需要获取那个属性值)
-join ";" 表示获取出来的多值在数组中以;进行分隔开。
===================================================================================================================
下面命令可以对多值属性中的值信息筛选,筛选包含x500的值,然后将包含x500的值导出到数组中。
Get-Mailbox | Select-Object name,displayname,@{label='EmailAddresses';expression={($_.EmailAddresses | ?{$_ -like "*x500*"}) -join ";"}} | Export-Csv -Path c:\temp\x500.csv -NoTypeInformation -Encoding UTF8
以此类推,如果去获取AD Object中包含多值属性时,可以使用上述方法来搞定。