发送电子邮件的PowerShell脚本崩溃Outlook 2010

时间:2013-09-05 12:47:25

标签: powershell outlook outlook-2010

以下脚本执行以下操作 - 创建新电子邮件,打开Excel文件,从中复制内容,粘贴到新电子邮件中并发送。
我有两台测试脚本的PC。该脚本是使用PowerShell 2.0 64位ISE在PC1上开发的。 PC1- Windows 7 64位SP1,Office 2010 32位和PowerShell 2.0 PC2- Windows 7 64位SP1,Office 2010 32位和PowerShell 3.0。

我使用PowerShell ISE在两台机器上运行脚本。这两台机器的主要区别是PowerShell版本。

Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null 
$olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]  
$outlook = new-object -comobject Outlook.Application 
$namespace = $outlook.GetNameSpace("MAPI") 
$InboxFolder = $namespace.getDefaultFolder($olFolders::olFolderInBox) 
$InboxItems = $InboxFolder.items

$newmail = $outlook.CreateItem(0)
$newmail.Display()

$newmail.Recipients.Add("user@domain.com")  
$newMail.Subject = "Report"  

$excel = New-Object -comobject Excel.Application
$FilePath = "D:\Report.xlsx"
$ReportWorkBook = $excel.Workbooks.Open($FilePath)
$excel.Visible = $true
$ws = $ReportWorkBook.Worksheets.Item(1)
$SelectedRange = $ws.UsedRange
$SelectedRange.Copy()

# PasteExcelTable works on PC1 but Fails on PC2 consistently (with PowerShell 3.0)
#$newmail.HTMLBody +=$newmail.GetInspector.WordEditor.Range().PasteExcelTable($false,$false,$true)
# Paste() worked on both PCs
$newmail.GetInspector.WordEditor.Range().Paste()

$newMail.Send()

$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Remove-Variable excel
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook)
Remove-Variable outlook

一个一致的问题是 - PowerShell启动的Excel.exe进程在脚本运行完毕后永远不会退出。我必须通过任务管理器手动终止任务。 (我打算发布一个单独的问题来解决这个问题。)

然而,主要问题是Outlook 2010的一致崩溃,但崩溃的点是不一致

脚本在PC1(使用PowerShell 2)上通过ISE运行5-6次,每次测试都生成一封电子邮件。但是在上次成功测试运行后几分钟我在Outlook 2010中得到了一个“无响应”对话框,它给了我重新启动它的选项。重新启动Outlook后再次冻结,然后我不得不杀死进程并再次启动它。

在PC2上使用PowerShell 3(通过ISE)每次运行脚本时都会冻结。它似乎总是崩溃粘贴操作。使用$newmail.GetInspector.WordEditor.Range().Paste()在PC2上工作。然而,在成功发送电子邮件几分钟后,Outlook再次冻结。

正如您所看到的 - Outlook崩溃/冻结时没有一致性...有时它是在粘贴时,有时是在尝试发送或保存电子邮件时,有时是在发送电子邮件之后!

2 个答案:

答案 0 :(得分:0)

似乎崩溃的原因是使用64位ISE而不是32位ISE。我一直用32位ISE运行脚本几天,到目前为止Outlook还没有崩溃。

我几乎总是使用64位ISE,即使是Excel和Word,但我还没有看到这些应用程序崩溃。奇怪的部分是间歇性的成功,然后是崩溃和错误。使用64位ISE运行时,理想情况下脚本应始终失败 它与在PowerShell v2或v3中运行脚本无关。 (在我的初始测试中,我确实尝试过使用32位ISE一次,但是Outlook仍然会崩溃一次,但那是因为它已经处于不稳定状态,并完成了多次测试。) 简而言之,最好使用32位ISE和32位应用程序。

答案 1 :(得分:0)

关于Excel没有关闭...... 如果剪贴板中有超过101个单元格,Excel将提示您是否要将剪贴板的内容保留在内存中。在关闭Excel之前,请使用以下命令清除剪贴板:

[System.Windows.Forms.Clipboard]::Clear()