下载SharePoint文件-PowerShell异常:无法从

时间:2018-09-03 12:59:05

标签: powershell exception sharepoint windows-server-2012

我收到以下错误

  

Get-PnPFile:不能从BeginProcessing,ProcessRecord和EndProcessing方法的覆盖范围之外调用WriteObject和WriteError方法,而只能在同一线程内调用它们。验证cmdlet正确进行了这些调用,或与Microsoft客户支持服务联系。

运行此PowerShell脚本时:

$cred = Get-Credential;
$webUrl = "https://...sharepoint.com";
$listUrl = "..";
$destination = "C:\\Folder1"

Connect-PnPOnline -Url $webUrl -Credentials $cred
$web = Get-PnPWeb
$list = Get-PNPList -Identity $listUrl

function ProcessFolder($folderUrl, $destinationFolder) {
    $folder = Get-PnPFolder -RelativeUrl $folderUrl
    $tempfiles = Get-PnPProperty -ClientObject $folder -Property Files

    if (!(Test-Path -Path $destinationfolder)) {
        $dest = New-Item $destinationfolder -Type Directory
    }

    $total = $folder.Files.Count
    for ($i = 0; $i -lt $total; $i++) {
        $file = $folder.Files[$i]

        Get-PnPFile -ServerRelativeUrl $file.ServerRelativeUrl -Path 
        $destinationfolder -FileName $file.Name -AsFile
    }
}

function ProcessSubFolders($folders, $currentPath) {
    foreach ($folder in $folders) {
        $tempurls = Get-PnPProperty -ClientObject $folder -Property ServerRelativeUrl    
        # Avoid Forms folders
        if ($folder.Name -ne "Forms") {
            $targetFolder = $currentPath +"\"+ $folder.Name;
            ProcessFolder 
            $folder.ServerRelativeUrl.Substring($web.ServerRelativeUrl.Length) 
            $targetFolder 
            $tempfolders = Get-PnPProperty -ClientObject $folder -Property Folders
            ProcessSubFolders $tempfolders $targetFolder
        }
    }
}

# Download root files
ProcessFolder $listUrl $destination + "\" 
# Download files in folders
$tempfolders = Get-PnPProperty -ClientObject $list.RootFolder -Property Folders
ProcessSubFolders $tempfolders $destination + "\"

此脚本可以在Win10 PC上正常运行,但不能在Win Server上运行。谁能告诉我原因是什么?

2 个答案:

答案 0 :(得分:0)

今天早上再次尝试此操作后,以上脚本可在Windows 10 PC和Windows Server上使用,

Alexandra

答案 1 :(得分:0)

在某些情况下,这可以帮助人们寻找确切的异常。例外似乎并不能解释实际发生的情况,因此这里有一些背景信息供人们查看情况是否类似于我的情况:

它是在我使用Powershell和Get-PNPFile从Sharepoint网站批量获取文件时生成的。经过一番摸爬滚打,它似乎与先前下载中的文件是否存在于本地系统上有关。由于该脚本用于在共享点站点上保留某些文件夹的本地副本,因此我尝试在服务器文件较新的情况下在本地覆盖文件。 (有点像粗糙的rsync)。

如果文件{存在,Get-PnpFile似乎并没有破坏(悄无声息)文件,但是会产生此异常。没有错误的代码概要如下:

Try {
           $local_path = ($local_dir + $local_file)
           #test for the local file first and rename it
           if( Test-Path ( $local_path  ) -PathType Leaf ){
               Rename-Item $local_path ($local_path + '.old' )
           }

           #get the file
           Get-PnpFile -ServerRelativeUrl $file.ServerRelativeUrl -Path $local_dir -FileName $local_file -AsFile

            #remove the old file
           if( Test-Path ( $local_path  ) -PathType Leaf ){

                Remove-Item ($local_path + '.old' )
           }
    }
    Catch {
           #handle error and continue
    }

首先本质上测试本地文件,然后对其进行重命名,下载文件,删除重命名的本地文件。我将其包装在Try catch块中,以便如果该文件的下载失败,则可以作为循环的一部分继续进行,后来我可以搜索带有.old后缀的任何文件名,并恢复失败的最新本地文件,从而那些。

再次运行脚本时,该脚本将在本地看不到远程文件(因为名称不匹配并获取新副本,但如果成功则将.old(从上次运行中清除)文件清除掉。在获取文件中。

我再也没有看到异常。 希望对别人有帮助。

P.S。 (如果您的任何文件以.old奇怪/未知结尾,则上述简单方法会发生....已被警告)

更新 每当我看到此异常的新原因时,我都会在这里更新

更新 在文件名中出现“ [”或“]”方括号也可能导致此问题。也许在URL中需要urlencoding或转义。...