如何在Powershell中基于多个匹配的字段值创建数据子集?

时间:2013-01-16 15:51:26

标签: powershell

我有一个powershell脚本,它使用EWS托管API提取电子邮件,从地址,地址和internetmessageheaders读取主题。在电子邮件读取循环中,它将所有这些信息加载到数据表中。

我需要获取每条消息的所有上述信息,并根据from地址填充数组或数据表。然后我将检查中继信息并将基于地址的整个列表发送到目标地址。

我似乎无法解决如何构建来自地址列表的问题。我已经尝试将数据表数据转换为哈希表,然后使用sort|get-unique从地址获取唯一的列表,但是无法使用此信息来正确构建从地址数组。我已经尝试使用select-string $_ -allmatches进行循环,但没有到达任何地方。

以下是我的代码的一部分,它创建数据表并使用每封电子邮件中的信息填充它。

$msgTable = New-Object system.Data.DataTable “Messages”
$col1 = New-Object system.Data.DataColumn Subject,([string])
$col2 = New-Object system.Data.DataColumn From,([string])
$col3 = New-Object system.Data.DataColumn To,([string])
$col4 = New-Object system.Data.DataColumn Relay,([string])
$msgTable.columns.add($col1)
$msgTable.columns.add($col2)
$msgTable.columns.add($col3)
$msgTable.columns.add($col4)

$frItemResult = $PublicFolder.FindItems($sfCollection,$view)
# Loop through view results and mark read
$frItemResult | ForEach-object{
if($_.HasAttachments ) {
$_.Load()
"Report Subject: $($_.Subject)"
# Loop through attachments, extract info
$_.Attachments | ForEach-object  {
if($_.Name -notmatch "ATT00001"){
$_.Load($attPropset)

$row = $msgTable.NewRow();$row.Subject = $($_.item.Subject); $row.From = ($_.item.From.address); $row.To = $($_.item.ToRecipients.address); $row.Relay = "$($_.Item.InternetMessageHeaders | Where-Object {$_.name -like "*received*"})";$msgTable.Rows.Add($row) 

以下是填充数据后$msgTable的样子。

Subject                          From                             To                               Relay                           
-------                          ----                             --                               -----                           
Message1                        user1@company.com           recipient1@yahoo.com               Received-SPF=pass (domain of ...
Message2                        user2@company.com           recipient2@comcast.net             Received=from imta27.mailguys...
Message2                        user2@company.com           recipient3@yahoo.com               Received-SPF=pass (domain of ...
Message3                        user3@company.com           recipient4@sbcglobal.net           Received-SPF=pass (domain of ...

我需要能够将user2@company.com的所有信息发送到另一个变量,并对任意数量的其他重复或非重复地址执行相同的操作。

然后我将从每个地址变量中取出并将其发送给目标收件人。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试使用Group-Object,然后可以针对每个分组运行foreach循环:

$Grouping = $msgTable | Group-Object -Property From
foreach ($Group in $Grouping)
{
    Write-Host $Group.Name -ForegroundColor "Green"
    $Group.Group | ft -Auto
}

答案 1 :(得分:1)

酷运动!这就是我接近它的方式......

  

...我需要能够提供所有信息   user2@company.com到另一个变量

$patternMatches = $msgTable | select-string -pattern 'user2@company.com'
  

...并对任何其他重复或非重复进行同样的操作   来自地址。

$uniqueEmails = $msgTable | Select-Object From -Unique

foreach ($email in $uniqueEmails) {
    $patternMatches = $msgTable | Select-Object -property * | select-string -pattern $email
}

我知道这不完全正确,但它应该会把你推向正确的方向。