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

用于发送电子邮件的PowerShell脚本崩溃Outlook 2010,powershell,outlook,outlook-2010,Powershell,Outlook,Outlook 2010,下面的脚本执行以下操作-创建新电子邮件,打开excel文件,从中复制内容,粘贴到新电子邮件并发送。 我有两台电脑上的脚本进行了测试。该脚本是使用PowerShell 2.0 64位ISE在PC1上开发的。PC1-带SP1、Office 2010 32位和PowerShell 2.0的64位Windows 7。 PC2-Windows 7 64位,带有SP1、Office 2010 32位和PowerShell 3.0 我已经使用PowerShell ISE在两台机器上运行了该脚本。这两台机器之间

下面的脚本执行以下操作-创建新电子邮件,打开excel文件,从中复制内容,粘贴到新电子邮件并发送。
我有两台电脑上的脚本进行了测试。该脚本是使用PowerShell 2.0 64位ISE在PC1上开发的。PC1-带SP1、Office 2010 32位和PowerShell 2.0的64位Windows 7。
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的持续崩溃,但崩溃点是不一致的

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

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


正如您所见,Outlook崩溃/冻结时没有一致性…有时是在粘贴时,有时是在尝试发送或保存电子邮件时,有时是在发送电子邮件后

造成崩溃的原因似乎是使用了64位ISE而不是32位ISE。我已经用32位ISE运行了几天了,到目前为止Outlook还没有崩溃

我几乎总是使用64位ISE,即使是Excel和Word,但我没有看到这些应用程序崩溃。奇怪的是断断续续的成功,然后是崩溃和错误。在使用64位ISE运行时,脚本在理想情况下应该始终失败。
它与在PowerShell v2或v3中运行脚本无关。(在我最初的测试中,我曾经尝试过使用32位ISE,但outlook仍然崩溃过一次,但这是因为它已经在不稳定的状态下进行了多次测试。)
简而言之,最好将32位ISE与32位应用程序配合使用

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

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

有趣。到目前为止,我一直在使用stop进程来终止脚本末尾正在运行的excel进程。我将尝试清除剪贴板并查看是否调用
$excel.Quit();[System.Runtime.Interopservices.Marshall]::ReleaseComObject($excel)
现在将关闭进程。我清除了剪贴板,但在脚本结束后excel进程仍在运行。我仍然必须继续使用
停止进程
来结束正在运行的实例。