【问题标题】:PowerShell script to extract .xls file from specific Outlook folder从特定 Outlook 文件夹中提取 .xls 文件的 PowerShell 脚本
【发布时间】:2014-03-02 12:13:17
【问题描述】:

我想从我每天收到的电子邮件中提取并保存一个 .xls 文件。我设置了一个规则,将电子邮件保存在 Outlook 邮箱中,位于收件箱的特定子文件夹中。

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))
      }
  }
}

【问题讨论】:

    标签: excel powershell outlook powershell-2.0 etl


    【解决方案1】:

    试一试。

    $Account = $n.Folders | ? { $_.Name -eq 'username@domain.com' };
    $Inbox = $Account.Folders | ? { $_.Name -match 'Inbox' };
    $f = $Inbox.Folders | ? { $_.Name -match 'ToExtract' };
    

    【讨论】:

    • 感谢您的建议,但正如原帖中所述,ToExtractInbox 的子文件夹中的子文件夹
    【解决方案2】:
    $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

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 2016-10-09
      • 1970-01-01
      • 2022-08-05
      • 2023-03-28
      • 1970-01-01
      • 2016-07-25
      • 2011-08-05
      • 1970-01-01
      相关资源
      最近更新 更多