2013-09-05 2 views
-1

아래 스크립트는 새 전자 메일 만들기, Excel 파일 열기, 내용 복사, 새 전자 메일에 붙여 넣기 및 보내기 기능을 수행합니다.
스크립트가 테스트 된 PC가 2 대 있습니다. 이 스크립트는 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를 통해 PC1 (PowerShell 2 사용)에서 5-6 회 실행되었으며 각 테스트에서 전자 메일이 생성되었습니다. 그러나 몇 분 후에 마지막으로 성공적인 테스트를 실행하면 Outlook 2010에서 "응답하지 않음"대화 상자가 나타나고 다시 시작할 수있는 옵션이 나타납니다. Outlook을 다시 시작한 후 다시 동결 된 다음 프로세스를 종료하고 다시 시작해야했습니다.

PowerShell 3이 설치된 PC2 (ISE를 통해)에서 스크립트를 실행할 때마다 Outlook이 멈췄습니다. 항상 붙여 넣기 작업이 중단 된 것처럼 보였습니다. $newmail.GetInspector.WordEditor.Range().Paste()을 사용하여 PC2에서 작업했습니다. 그러나 이메일이 성공적으로 전송 된 후 2 분이 지나면 Outlook이 다시 동결되었습니다.

Outlook에서 충돌/정지가 발생하는 경우 일관성이 없습니다 ... 이메일을 보내거나 저장하려고 시도 할 때 가끔씩 붙여 넣을 때가 있습니다.

답변

0

32 비트 ISE 대신 64 비트 ISE가 사용 된 것이 원인 인 것 같습니다. 나는 이틀 동안 32 비트 ISE로 스크립트를 실행 해왔다. 지금까지 Outlook은 다운되지 않았다.

저는 Excel과 Word에서도 거의 항상 64 비트 ISE를 사용했지만 이러한 응용 프로그램은 작동하지 않습니다. 이상한 부분은 간헐적으로 성공한 다음 충돌과 오류입니다. 64 비트 ISE로 실행하면 이상적으로 스크립트가 항상 실패해야합니다.
PowerShell v2 또는 v3에서 스크립트를 실행하는 것과 아무런 관련이 없습니다. (초기 테스트에서는 32 비트 ISE를 한 번 사용해 보았지만 여러 가지 테스트를 통해 불안정한 상태에 있었기 때문에 Outlook이 여전히 충돌했습니다.) 즉, 32 비트 ISE를 사용하는 것이 좋습니다. 32 비트 애플리케이션.

0

관련 Excel ... 닫기 클립 보드에 101 개가 넘는 셀이있는 경우 클립 보드의 내용을 메모리에 유지할지 묻는 메시지가 나타납니다. Excel을 종료하기 전에 아래 명령을 사용하여 클립 보드를 지 웁니다.

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

흥미 롭습니다. 지금까지 나는 stop-process를 사용하여 스크립트가 끝날 때 실행중인 Excel 프로세스를 종료했습니다. 클립 보드를 지우고'$ excel.Quit(); [System.Runtime.Interopservices.Marshal] :: ReleaseComObject ($ excel)'이 프로세스를 닫습니다. – Ron

+0

클립 보드가 지워졌지만 스크립트가 끝난 후에도 Excel 프로세스가 계속 실행 중입니다. 계속 실행중인 인스턴스를 종료하기 위해'Stop-Process'를 계속 사용해야합니다. – Ron

관련 문제