如何将Outlook电子邮件正文存储在数组中 - Powershell?

时间:2013-12-31 20:00:28

标签: arrays powershell outlook powershell-ise

下面的脚本会读取我的Outlook电子邮件但是如何访问输出。我太新了Powershell,我仍然习惯于某些事情。我只想获取10个未读的Outlook电子邮件的正文,并将它们存储在名为$ Body的数组中。

$olFolderInbox = 6
$outlook = new-object -com outlook.application;
$ns = $outlook.GetNameSpace("MAPI");
$inbox = $ns.GetDefaultFolder($olFolderInbox)

#checks 10 newest messages
$inbox.items | select -first 10 | foreach {
if($_.unread -eq $True) {
$mBody = $_.body

#Splits the line before any previous replies are loaded
$mBodySplit = $mBody -split "From:"

#Assigns only the first message in the chain
$mBodyLeft = $mbodySplit[0]

#build a string using the –f operator
$q = "From: " + $_.SenderName + ("`n") + " Message: " + $mBodyLeft

#create the COM object and invoke the Speak() method 
(New-Object -ComObject SAPI.SPVoice).Speak($q) | Out-Null
} 
}

3 个答案:

答案 0 :(得分:1)

在循环之前定义$body = @();

然后只需使用+=添加元素

答案 1 :(得分:1)

这可能不是一个因素,因为你只循环了十个元素,但使用+ =向元素添加元素是非常慢的。

另一种方法是输出循环中的每个元素,并将循环结果赋给$ body。这是一个简化的例子,假设你想要$ _。body:

$body = $inbox.items | select -first 10 | foreach {
  if($_.unread -eq $True) {
    $_.body
  }
}

这是有效的,因为循环期间输出的任何内容都将分配给$ body。并且它比使用+ =更快 。您可以自己验证这一点。比较使用10,000个元素创建数组的两种方法:

Measure-Command {
  $arr = @()
  1..10000 | % { 
    $arr += $_ 
  }
}

在我的系统上,这需要超过14秒。

Measure-Command {
  $arr = 1..10000 | % { 
    $_
  }
}

在我的系统上,这需要0.97秒,这使它快14倍。同样,如果您只是循环浏览10个项目,可能不是一个因素,但如果您需要创建更大的数组,请记住一些事项。

答案 2 :(得分:1)

这是另一种方式:

$body = $inbox.Items.Restrict('[Unread]=true') | Select-Object -First 10 -ExpandProperty Body