Загрузить исключение SharePoint Files-PowerShell: методы WriteObject и WriteError нельзя вызывать извне переопределений - PullRequest
0 голосов
/ 03 сентября 2018

Я получаю следующую ошибку

Get-PnPFile: методы WriteObject и WriteError нельзя вызывать извне переопределений методов BeginProcessing, ProcessRecord и EndProcessing, и они могут вызываться только из одного потока. Убедитесь, что командлет правильно выполняет эти вызовы, или обратитесь в службу поддержки клиентов 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, но не на сервере Win. Кто-нибудь может сказать мне, в чем причина, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

В некоторых случаях это может помочь людям, которые ищут это точное исключение. Исключение, похоже, не объясняет, что на самом деле происходило, поэтому вот некоторые предпосылки, чтобы люди могли увидеть, похожа ли ситуация на мою:

Он был создан, когда я использовал Powershell и Get-PNPFile для массового получения файлов с сайта Sharepoint. После некоторой царапины на голове это, похоже, связано с существованием файла, уже присутствующего в локальной системе после предыдущей загрузки. Поскольку скрипт использовался для хранения локальной копии определенных папок на сайте 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 нужно урленкодирование или экранирование ....

0 голосов
/ 04 сентября 2018

После повторной попытки этим утром вышеприведенный скрипт работает как на ПК с Windows 10, так и на Windows Server,

Александра

...