我们经常遇到使用Exchange Powershell去导出邮箱用户属性值到CSV文件中时,会出现某些属性值无法导出问题。

例如下面的例子:

========================================================================================================================

使用命令获取邮箱用户的EmailAddresses属性值,下面的命令能够将结果输出到屏幕。

Get-Mailbox | fl name,displayname,EmailAddresses

使用Powershell如何导出Exchange对象中的多值属性值_Powershell MultiValu

如果使用如下命令,将产生的结果使用Export-CSV导出到CSV文件中。生成的CSV文件中关于EmailAddresses列的值变成了一个不认识的值。

Get-Mailbox | Select-Object name,displayname,EmailAddresses | Export-Csv -Path c:\temp\x500-01.csv -NoTypeInformation -Encoding UTF8

使用Powershell如何导出Exchange对象中的多值属性值_Powershell MultiValu_02

======================================================================================================================

为什么会出现这样的情况?

======================================================================================================================

     通过命令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的属性值正常显示了。

使用Powershell如何导出Exchange对象中的多值属性值_Powershell MultiValu_03

    上面命令能够成功达到目的,关键是由@{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

使用Powershell如何导出Exchange对象中的多值属性值_Powershell MultiValu_04

 

            以此类推,如果去获取AD Object中包含多值属性时,可以使用上述方法来搞定。