我正在编写一个脚本,它将Outlook文件夹作为输入,并将每个未读邮件移动到不同的文件夹。我的代码:
Add-Type -assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$olFolderInbox = 6
$inbox = $namespace.GetDefaultFolder($olFolderInbox)
$myFolder = $namespace.pickfolder()
$toFolder = $inbox.Folders | where-object { $_.name -eq "UnreadMessages" }
$messages = $myFolder.Items
$messageCount = $messages.count
for ($i = $messageCount - 1; $i -ge 0; $i--)
{
if ($messages[$i].unread -eq $True)
{
$message.move($toFolder)
}
}
问题是,我无法遍历“消息”对象。错误:
无法索引System.__ComObject
类型的对象。
如果不可能,那我该怎么做呢? 提前谢谢。
EDIT。这是我使用PowerShell的第一天:)
答案 0 :(得分:1)
尝试在其上执行get-member,并查看您的选项。
$Messages | Get-Member -force
如果您弄清楚如何继续,那么您可以使用ForEach-Object循环浏览$ Messages的内容,如下所示
$Messages | ForEach-Object { Script code }
或使用其缩写:
$Messages | % { Script code }
答案 1 :(得分:1)
所有Outlook集合都是1,而不是0 - 您需要从Items.Count
迭代到1。
其次,不要只浏览文件夹中的所有消息,请使用Items.Find
/ FindNext
。在您的情况下,搜索条件为"[Unread] = true"
。
答案 2 :(得分:0)
虽然无法使用PowerShell常用的索引语法 - $messages[$i]
-
要访问$messages
的元素,您可以在文件夹对象上使用.Items($i)
(请参阅the docs):
此外,如Dmitry Streblechenko's helpful answer所述,索引从1
开始,而不是0
:
for ($i = $myFolder.Items.Count; $i -ge 1; $i--)
{
$message = $myFolder.Items($i)
if ($message.unread)
{
$message.move($toFolder)
}
}
对于没有索引的简单正向枚举,您可以使用foreach
:
foreach ($message in $myFolder.Items) {
if ($message.unread)
{
$message.move($toFolder)
}
}
($myFolder.Items | ForEach-Object { ... }
也应该有效,但速度会慢一些。)
尽管如此,Dmitry's answer回答还指出如何在源执行过滤枚举,这样做的效果要好得多。
答案 3 :(得分:0)
感谢您的回复。你的所有答案都很有帮助。我终于使用了foreach循环。当我试图使用$message = $myFolder.Items($i)
时出现以下错误:
Method invocation failed because [System.__ComObject] doesn't cont
ain a method named 'Items'
因此在这种情况下不可能使用索引进行迭代。
谢谢大家的时间:)