-1

下面的脚本执行以下操作 - 创建一个新电子邮件,打开一个 Excel 文件,从中复制内容,粘贴到新电子邮件中并发送。
我有两台测试脚本的 PC。该脚本是在 PC1 上使用 PowerShell 2.0 64 位 ISE 开发的。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 始终崩溃,但崩溃的点不一致

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

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

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

4

2 回答 2

0

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

[System.Windows.Forms.Clipboard]::Clear()
于 2014-06-13T19:31:30.927 回答
0

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

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

于 2013-09-15T06:47:31.730 回答