2014-02-05 56 views
2

我想從每天收到的電子郵件中提取並保存.xls文件。我設置了一個規則,將電子郵件保存在收件箱中特定子文件夾的Outlook郵箱中。從特定Outlook文件夾中提取.xls文件的PowerShell腳本

Outlook文件夾結構如下:

-> Inbox 

--> Data (subfolder of "Inbox") 

---> ToExtract (subfolder of "Data") 

我需要從 「ToExtract」 文件夾中提取.xls文件。

I found a script它爲我完成了大部分工作,但它需要用戶監督腳本並手動選擇要搜索的Outlook文件夾。我需要更改腳本,以便它指向「ToExtract」子文件夾。

代碼如下。它工作正常,但我需要修改pickfolder()部分。

#file path 
$filepath = 「c:\test\」 


#set outlook to open 
$o = New-Object -comobject outlook.application 
$n = $o.GetNamespace(「MAPI」) 


#you'll get a popup in outlook at this point where you pick the folder you want to scan 
$f = $n.pickfolder() 

#date string to search for in attachment name 
$date = Get-Date -Format yyyyMMdd 


#now loop through them and grab the attachments 
$f.Items | foreach { 
    $_.attachments | foreach { 
    Write-Host $_.filename 
    $a = $_.filename 
    If ($a.Contains($date)) { 
    $_.saveasfile((Join-Path $filepath $a)) 
     } 
    } 
} 

回答

2

給這個鏡頭。

$Account = $n.Folders | ? { $_.Name -eq '[email protected]' }; 
$Inbox = $Account.Folders | ? { $_.Name -match 'Inbox' }; 
$f = $Inbox.Folders | ? { $_.Name -match 'ToExtract' }; 
+0

感謝您的建議,但在原來的文章中提到,'ToExtract'是更新了答案Inbox' –

+0

的'子文件夾內的子文件夾。 –

+1

美麗。謝謝你的幫助! –

-1
$MailboxName = "MAILBOX" 
$Subject = "EMAIL SUBJECT" 
$ProcessedFolderPath = "/Inbox/Processed" 
$downloadDirectory = "c:\temp" 

Function FindTargetFolder($FolderPath){ 
    $tfTargetidRoot = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$MailboxName) 
    $tfTargetFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$tfTargetidRoot) 
    $pfArray = $FolderPath.Split("/") 
    for ($lint = 1; $lint -lt $pfArray.Length; $lint++) { 
     $pfArray[$lint] 
     $fvFolderView = new-object Microsoft.Exchange.WebServices.Data.FolderView(1) 
     $SfSearchFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+isEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName,$pfArray[$lint]) 
       $findFolderResults = $service.FindFolders($tfTargetFolder.Id,$SfSearchFilter,$fvFolderView) 
     if ($findFolderResults.TotalCount -gt 0){ 
      foreach($folder in $findFolderResults.Folders){ 
       $tfTargetFolder = $folder    
      } 
     } 
     else{ 
      "Error Folder Not Found" 
      $tfTargetFolder = $null 
      break 
     } 
    } 
    $Global:findFolder = $tfTargetFolder 
} 

$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll" 
[void][Reflection.Assembly]::LoadFile($dllpath) 
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1) 


$windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() 
$sidbind = "LDAP://<SID=" + $windowsIdentity.user.Value.ToString() + ">" 
$aceuser = [ADSI]$sidbind 

$service.AutodiscoverUrl($aceuser.mail.ToString()) 

FindTargetFolder($ProcessedFolderPath) 

$folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MailboxName) 
$InboxFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid) 
$Sfir = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead, $false) 
$Sfsub = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject, $Subject) 
$Sfha = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::HasAttachments, $true) 
$sfCollection = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And); 
$sfCollection.add($Sfir) 
$sfCollection.add($Sfsub) 
$sfCollection.add($Sfha) 
$view = new-object Microsoft.Exchange.WebServices.Data.ItemView(2000) 
$frFolderResult = $InboxFolder.FindItems($sfCollection,$view) 
foreach ($miMailItems in $frFolderResult.Items){ 
    $miMailItems.Subject 
    $miMailItems.Load() 
    foreach($attach in $miMailItems.Attachments){ 
    $attach.Load() 
     $fiFile = new-object System.IO.FileStream(($downloadDirectory + 「\」 + $attach.Name.ToString()), [System.IO.FileMode]::Create) 
     $fiFile.Write($attach.Content, 0, $attach.Content.Length) 
     $fiFile.Close() 
     write-host "Downloaded Attachment : " + (($downloadDirectory + 「\」 + $attach.Name.ToString())) 
    } 
    $miMailItems.isread = $true 
    $miMailItems.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AlwaysOverwrite) 
    [VOID]$miMailItems.Move($Global:findFolder.Id) 
} 

https://gist.github.com/bleep-io/5151579

相關問題