我有一个连接到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项目。我会四处寻找解决方案,但我想发布这个以防万一有人能指出我正确的方向。
答案 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)")
这将检查并查看是否已下载,如果没有,则会等到下载后再保存文件。