2013-09-05 111 views
-1

下面的腳本執行以下操作 - 創建一個新的電子郵件,打開一個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腳本來發送電子郵件崩潰的Outlook 2010

我已經在兩臺機器上使用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("[email protected]") 
$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 5-6倍PC1上運行(使用PowerShell 2)和各試驗後而產生的電子郵件。但是,在最後一次成功的測試運行後的幾分鐘後,我在Outlook 2010中收到了「無響應」對話框,它讓我有選擇重新啓動它。重新啓動後,Outlook再次凍結,然後我不得不殺死該進程並重新啓動。

在使用PowerShell 3(通過ISE)每次我跑的腳本的Outlook凍結PC2。它似乎總是崩潰粘貼操作。在PC2上使用$newmail.GetInspector.WordEditor.Range().Paste()。但是,在成功發送電子郵件幾分鐘後,Outlook再次凍結。

正如你所看到的 - 存在時,Outlook將崩潰沒有一致性/凍結......有時它同時粘貼,有時想有時發送電子郵件後,發送或保存電子郵件時是!

回答

0

看來崩潰的原因是使用64位ISE而不是32位的ISE。我已經使用32位ISE運行腳本幾天了,迄今爲止Outlook還沒有崩潰。

我幾乎總是使用64位ISE甚至Excel和Word,但我還沒有看到這些應用程序崩潰。奇怪的部分是間歇性的成功,然後是崩潰和錯誤。使用64位ISE運行時,腳本理想情況下總是失敗。
它與在PowerShell v2或v3中運行腳本無關。 (在我最初的測試中,我嘗試了一次使用32位ISE,但是outlook仍然崩潰了一次,但那是因爲它已經處於不穩定狀態,並且已經完成了幾次測試。)總之,最好使用32位ISE 32位應用程序。

0

關於Excel未關閉... 如果剪貼板中有多於101個單元格,Excel將提示您是否要將剪貼板的內容保留在內存中。在關閉Excel之前,使用以下命令清除剪貼板:

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

有趣。到目前爲止,我一直在使用stop-process來終止腳本末尾的運行excel進程。我會嘗試清除剪貼板,看看是否調用'$ excel.Quit(); [System.Runtime.Interopservices.Marshal] :: ReleaseComObject($ excel)'現在將關閉該進程。 – Ron

+0

我清除了剪貼板,但是腳本結束後,excel進程仍在運行。我仍然需要繼續使用'Stop-Process'來結束正在運行的實例。 – Ron