转换powershell脚本保存Outlook附件以将其保存在非收件箱但是收件箱子文件夹中

时间:2016-03-23 14:50:26

标签: powershell outlook

我有一个从其他脚本中删除的脚本。它的工作原理除了我对powershell很新,我是一个系统管理员而不是开发人员(但是读我的屁股)。我可以让scrtipt在outlook中从收件箱下载附件,但是需要它从子文件夹下载附件:

############################# Outlook Call ##############################

$olFolderInbox = 6 
$outlook = new-object -com outlook.application; 
$ns = $outlook.GetNameSpace("MAPI"); 
$inbox = $ns.GetDefaultFolder($olFolderInbox)
$messages = $inbox.items 
write-host $messages.count 
$messcount = $messages.count 




foreach($message in $messages){ 


##############Save Attachments################

$filepath = "c:\attachments\" 
$message.attachments|foreach { 
    Write-Host $_.filename 
    $attr = $_.filename 

    $_.saveasfile((Join-Path $filepath $_.filename))

    $a = $_.filename 
    If ($a.Contains("")) { 
    $_.saveasfile((Join-Path $filepath $a)) 
                             } 
  } 

}



###########END##########

任何想法?会非常感激。

2 个答案:

答案 0 :(得分:1)

$OutputFolder = 'C:\tests';
$ErrorActionPreference= 'silentlycontinue'
$outlook = New-Object -ComObject Outlook.Application; 
$olFolderInbox = 6;
$ns = $outlook.GetNameSpace("MAPI"); 
$inbox = $ns.GetDefaultFolder($olFolderInbox);
$inbox.Folders `
    | ? Name -eq 'colour' `
    | % Items `
    | % Attachments `
    | % {
        $OutputFileName = Join-Path -Path $OutputFolder -ChildPath $_.FileName;
        if (Test-Path $OutputFileName) {
            $FileDirectoryName = [System.IO.Path]::GetDirectoryName($OutputFileName);
            $FileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($OutputFileName);
            $FileExtension = [System.IO.Path]::GetExtension($OutputFileName);

            for ($i = 2; Test-Path $OutputFileName; $i++) {
                $OutputFileName = "{0} ({1}){2}" -f (Join-Path -Path $FileDirectoryName -ChildPath $FileNameWithoutExtension), $i, $FileExtension;
            }
        }
        Write-Host $OutputFileName;
        $_.SaveAsFile($OutputFileName)
    }

Remove-Item -Path C:\tests\*.jpg
Remove-Item -Path C:\tests\*.png

Start-Process –FilePath “c:\tests\*.docx” –Verb Print -PassThru  
Start-Process –FilePath “c:\tests\*.xlsx” –Verb Print -PassThru  
Start-Process –FilePath “c:\tests\*.doc” –Verb Print -PassThru  
Start-Process –FilePath “c:\tests\*.xls” –Verb Print -PassThru  
Start-Process –FilePath “c:\tests\*.pptx” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.ppt” –Verb Print -PassThru
Start-Process –FilePath “c:\tests\*.xls” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.msg” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.xlsm” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.rtf” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.pdf” –Verb Print -PassThru `
%{sleep 3;$_}
Remove-Item -Path C:\tests\*.*

这实现了我所需要的,我可能会在每一个之后放置一个杀戮过程,以确保没有文档卡住。

但是 - 要完成的一件事是我需要这个写入非默认打印机而不是更改现有的默认值?这是在服务器上运行的,vbscript已经使用默认打印机运行,因此如果它发生变化,它会搞砸。

答案 1 :(得分:0)

与COM对象一样,这样做非常难看。

你应该像问题here那样做,但我根本无法工作。 $Inbox.Folders['FolderName']不返回任何内容,$Inbox.Folders('FolderName')会返回错误。

以下是我如何让它发挥作用。我在使用Office 2013的PowerShell v4上。

假设您在\\ Inbox \ eReports \ Amazon \ StatsReports中有一个文件夹,并且您希望其中包含所有邮件。

$Messages = $inbox.Folders `
    | ? Name -eq 'eReports' `
    | % Folders `
    | ? Name -eq 'Amazon' `
    | % Folders `
    | ? Name -eq 'StatsReports' `
    | % Items;

请注意,我使用ForEach-ObjectWhere-Object的方式需要PowerShell v3。在早期版本中,这将是相当更详细。

这是在Win 7 x64 / PowerShell v4 / Office 2013上适用于我的脚本的完整版本。我已经在几个不同的文件夹上测试了它,所以它应该可以工作。

它将自动重命名具有重复名称的文件,遵循Windows约定添加(2),然后添加(3)等等。

$OutputFolder = 'C:\OutputFolder';

$outlook = New-Object -ComObject Outlook.Application; 
$olFolderInbox = 6;
$ns = $outlook.GetNameSpace("MAPI"); 
$inbox = $ns.GetDefaultFolder($olFolderInbox);
$inbox.Folders `
    | ? Name -eq 'eReports' `
    | % Folders `
    | ? Name -eq 'Amazon' `
    | % Folders `
    | ? Name -eq 'StatsReports' `
    | % Items `
    | % Attachments `
    | % {
        $OutputFileName = Join-Path -Path $OutputFolder -ChildPath $_.FileName;
        if (Test-Path $OutputFileName) {
            $FileDirectoryName = [System.IO.Path]::GetDirectoryName($OutputFileName);
            $FileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($OutputFileName);
            $FileExtension = [System.IO.Path]::GetExtension($OutputFileName);

            for ($i = 2; Test-Path $OutputFileName; $i++) {
                $OutputFileName = "{0} ({1}){2}" -f (Join-Path -Path $FileDirectoryName -ChildPath $FileNameWithoutExtension), $i, $FileExtension;
            }
        }
        Write-Host $OutputFileName;
        $_.SaveAsFile($OutputFileName);
    }