从Outlook中的SharePoint列表中获取最近收到的文件

时间:2014-04-03 15:56:46

标签: sharepoint powershell outlook etl

我有一个连接到Outlook的Sharepoint目录。每天都有一个csv发布到这个目录,我可以从Outlook中获取它而不是导航到Sharepoint站点。

我需要编写一个Powershell脚本,该脚本将从Outlook中的此Sharepoint列表中提取最新文件,并将其转储到本地目录中。

我无法直接从Sharepoint中提取,因为我没有管理员权限。我也不能直接从提供给Sharepoint的目录中提取,因为我没有权利使用该目录。这必须通过Outlook完成。

我认为我能够像从Outlook中提取电子邮件附件一样,但我的脚本不起作用:

#file path
$filepath = "I:\WriteToHere"
$account = "mail@company.com"    

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

$Account = $n.Folders | ? { $_.Name -eq $account };
    $Inbox = $Account.Folders | ? { $_.Name -match 'Root Folder' };
    $Data = $Inbox.Folders | ? { $_.Name -match 'Sub1' };
    $Year = $Data.Folders | ? { $_.Name -match 'Sub2' };
    $Month = $Year.Folders | ? { $_.Name -match 'Sub3' };

$email = $Month.Items| Sort-Object ReceivedTime -Descending | Select-Object -First 1

# Log the email we are looking for, and mention attachments if they exist.
Write-Output "Last email received at $($email.receivedtime), attached file(s) are: (if any)"
$email.attachments|%{Write-Output $_.filename}

# If the email has at least one attachment, save them to the filepath.
If($email.attachments.count -gt 0){
    $email.attachments|%{$_.saveasfile((join-path $filepath $_.filename))} 
} else { 
    Write-Output "Latest email at $($email.receivedtime) has no attachments!"
}

注意 - 收件箱中的Sharepoint项目只是csv文件。它们不是附件的消息。

我认为我不能像对待电子邮件那样处理这些Sharepoint项目。我会四处寻找解决方案,但我想发布这个以防万一有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:2)

好的,通过Outlook获取项目......完全可行!

#file path
$filepath = "I:\WriteToHere"

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

$SPL = $n.Folders | ? { $_.Name -eq "SharePoint Lists" }

现在,您需要做一些工作。您需要找到您要查找的文件夹。这样做:

$SPL.Folders|Select Name

您是否列出了可以找到文件的文件夹?它是嵌套文件夹吗?如果是这样的话:

\\SharePoint List\Document Library\Daily Files\Lists\04032014.csv

你必须深入到它所在的文件夹。所以,我们在这里给出一个例子:

$DocLib = $SPL.Folders|?{$_.Name -match "Document Library"}
$Dailies = $DocLib.Folders|?{$_.Name -match "Daily Files"}
$Lists = $Dailies.Folders|?{$_.Name -match "Lists"}

$TargetFile = $Lists.Items|?{$_.Subject -match "04032014.csv"}
If($TargetFile.DownloadState -eq 1){$TargetFile.SaveAs("$FilePath\$($TargetFile.Subject)")}

所以我得到了文档库对象,从中我得到了Daily Files对象,从中我得到了Lists对象。这让我们终于到了正确的文件夹。一旦我们有了文件夹,我们从中获取Items,在每个项目上我们获得了Subject属性,它是存储文件名的位置,我们过滤了所需的文件。一旦我们有了Item对象,我就通过检查DownloadState来检查它是否是从服务器下载的。 0 =尚未下载,1 =已下载。我想我们可以这样做:

$TargetFile = $Lists.Items|?{$_.Subject -match "04032014.csv"}
If($TargetFile.DownloadState -eq 0){
    do{start-sleep 1}while{$TargetFile.DownloadState -eq 0}
}
$TargetFile.SaveAs("$FilePath\$($TargetFile.Subject)")

这将检查并查看是否已下载,如果没有,则会等到下载后再保存文件。