【问题标题】:PowerShell script to send email crashes Outlook 2010用于发送电子邮件的 PowerShell 脚本使 Outlook 2010 崩溃
【发布时间】:2013-09-09 07:33:21
【问题描述】:

下面的脚本执行以下操作 - 创建一个新电子邮件,打开一个 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 崩溃/冻结的时间不一致...有时是在粘贴时,有时是在尝试发送或保存电子邮件时,有时是在发送电子邮件后!

【问题讨论】:

    标签: powershell outlook outlook-2010


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 有趣。到目前为止,我一直在使用 stop-process 在脚本末尾终止正在运行的 excel 进程。我将尝试清除剪贴板,看看现在调用$excel.Quit(); [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) 是否会关闭该进程。
      • 我清除了剪贴板,但脚本结束后 Excel 进程仍在运行。我仍然需要继续使用Stop-Process 来结束正在运行的实例。
      猜你喜欢
      • 1970-01-01
      • 2014-03-03
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多