-1

以下のスクリプトは次のことを行います - 新しい電子メールを作成し、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 がクラッシュ/フリーズするタイミングには一貫性がありません。貼り付け中、メールの送信または保存中、メールの送信後に発生することがあります。

4

2 に答える 2

0

Excel が閉じないことについて... クリップボードに 101 個を超えるセルがある場合、Excel はクリップボードの内容をメモリに保持するかどうかを尋ねます。Excel を閉じる前に、次のコマンドを使用してクリップボードを消去します。

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

クラッシュの原因は、32 ビット ISE の代わりに 64 ビット ISE を使用したことだったようです。数日間 32 ビット ISE でスクリプトを実行していますが、今のところ Outlook はクラッシュしていません。

Excel や Word にも 64 ビット ISE を使用してきましたが、これらのアプリがクラッシュしたことはありません。奇妙な部分は、断続的な成功と、その後のクラッシュとエラーです。64 ビット ISE で実行する場合、スクリプトは理想的には常に失敗するはずです。
PowerShell v2 または v3 でスクリプトを実行することとは何の関係もありませんでした。(私の最初のテストでは、32 ビット ISE を 1 回使用してみましたが、Outlook はまだ 1 回クラッシュしましたが、それは、いくつかのテストが行​​われたときに既に不安定な状態にあったためです。)ビット アプリケーション。

于 2013-09-15T06:47:31.730 に答える