Hashtable中的Powershell表达式



我最近对powershell脚本越来越了解。我边走边想,但我解不出这道题。

基本上我知道这段代码是有效的:

Get-Mailbox -ResultSize Unlimited |
Select-Object ExternalDirectoryObjectId, DisplayName,PrimarySmtpAddress, Alias, UserPrincipalName, ArchiveStatus, ArchiveDatabase,FirstName, LastName, RecipientTypeDetails, `
@{Name="EmailAddresses";Expression={
($_.EmailAddresses | 
Where-Object {$_ -clike "smtp:*"} | 
ForEach-Object {$_ -replace "smtp:",""}) -join "," 
}} |
Export-Csv "C:tempexport.csv" -NoTypeInformation -Encoding UTF8

问题是我想在所有邮箱上运行来自几个模块的命令,以生成单个CSV,所以我这样做:

$mailboxes = get-mailbox -resultsize unlimited
$export = @()
foreach($mailbox in $mailboxes)
{
$UPN = $mailbox.MicrosoftOnlineServicesID
$mailboxstat = Get-MailboxStatistics $UPN
$MSOL = get-msoluser -UserPrincipalName $UPN        

$Properties = @{
"Object ID" = $mailbox.ExchangeGUID
"Display Name" = $mailbox.DisplayName
"Alias" = $mailbox.Alias
"Primary SMTP Address" = $mailbox.PrimarySMTPAddress
"Mailbox Size" = $mailboxstat.TotalItemSize
"First" = $MSOL.FirstName
"Last" = $MSOL.LastName
"RecipientTypeDetails" = $mailbox.RecipientTypeDetails
"ArchiveStatus" = $mailbox.ArchiveStatus
"ArchiveGUID" = $mailbox.ArchiveGUID
"LitigationHold" = $mailbox.LitigationHold
"Licenses"=$MSOL.Licenses
"ProxyAddresses"= @{Name="EmailAddresses";Expression={($_.EmailAddresses | Where-Object {$_ -clike "smtp:*"}
}
write-host $UPN
#$properties += $x500
$export += New-Object psobject -property $properties 

}
write-host $export
$exportpath = saveAs
$export | 
select-object "Object ID", "Display Name","Primary SMTP Address","ProxyAddresses","ArchiveStatus","ArchiveGUID",First,Last,LitigationHold, "Mailbox Size" | 
Export-Csv -notypeinformation -path $exportpath

与代理地址分开工作。如果我将散列/表达式代码放在Export代码中,它将不会为每个邮箱生成结果。但无论我如何编码,我都无法让它产生我想要的结果。
我试着在$properties哈希表中创建一个新对象,转换字符串,几乎所有我能想到的或在谷歌上找到。
有人可以帮助我如何需要格式化这段代码的工作方式,我需要吗?

Thanks in advance

你的问题是你正在定义一个哈希表,你像Select-ObjectProperties参数一样对待,但是你然后把它发送到New-Object,它以非常不同的方式工作/将哈希表转换为PSObject,而不是选择现有的属性。

$export += ([PSCustomObject]@{
"Object ID" = $mailbox.ExchangeGUID
"Display Name" = $mailbox.DisplayName
"Alias" = $mailbox.Alias
"Primary SMTP Address" = $mailbox.PrimarySMTPAddress
"Mailbox Size" = $mailboxstat.TotalItemSize
"First" = $MSOL.FirstName
"Last" = $MSOL.LastName
"RecipientTypeDetails" = $mailbox.RecipientTypeDetails
"ArchiveStatus" = $mailbox.ArchiveStatus
"ArchiveGUID" = $mailbox.ArchiveGUID
"LitigationHold" = $mailbox.LitigationHold
"Licenses"=$MSOL.Licenses
"ProxyAddresses"= ($mailbox.EmailAddresses | Where-Object {$_ -clike "smtp:*"}) -join ','
})

。而不是提供代码将管道中的当前对象转换为一个名为EmailAddresses的属性,然后将该结果分配给一个名为ProxyAddresses的属性,只需计算并分配您希望ProxyAddresses直接拥有的值。

我还在哈希表之前使用[PSCustomObject]将哈希表转换为PSCustomObject并将其直接分配给您的数组。如果你喜欢的话,你可以继续将哈希表保存在一个变量中(例如$properties,因为它之前被称为),然后将其作为参数传递给New-Object,在分配给你的数组之前将其转换为PSObject

最新更新