以下のスクリプトは次のことを行います - 新しい電子メールを作成し、Excel ファイルを開き、そこからコンテンツをコピーし、新しい電子メールに貼り付けて送信します。
スクリプトをテストした 2 台の 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 ISE を使用して、両方のマシンでスクリプトを実行しました。2 つのマシンの主な違いは、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
一貫した問題の 1 つは、スクリプトの実行が終了した後、powershell によって開始された Excel.exe プロセスが終了しないことです。タスクマネージャーを介して手動でタスクを強制終了する必要があります。(これに対する解決策を得るために、別の質問を投稿する予定です。)
ただし、主な問題は、Outlook 2010 が一貫してクラッシュすることですが、クラッシュするポイントには一貫性がありません。
スクリプトは PC1 (PowerShell 2 を使用) で ISE 経由で 5 ~ 6 回実行され、各テストで電子メールが生成されました。ただし、最後のテスト実行が成功してから数分後に、Outlook 2010 で [応答していません] ダイアログ ボックスが表示され、再起動するオプションが表示されました。Outlook を再起動した後、再びフリーズし、プロセスを強制終了して再度開始する必要がありました。
PC2 で PowerShell 3 (ISE 経由) を使用して、スクリプトを実行するたびに Outlook がフリーズしました。貼り付け操作が常にクラッシュするようでした。使用$newmail.GetInspector.WordEditor.Range().Paste()
はPC2で動作しました。ただし、電子メールが正常に送信されてから数分後、Outlook は再びフリーズしました。
ご覧のとおり、Outlook がクラッシュ/フリーズするタイミングには一貫性がありません。貼り付け中、メールの送信または保存中、メールの送信後に発生することがあります。