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