我收到以下错误
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上运行。谁能告诉我原因是什么?
答案 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或转义。...