2 votes

Télécharger des fichiers SharePoint- Exception PowerShell : les méthodes WriteObject et WriteError ne peuvent pas être appelées en dehors des substituts de

Je reçois l'erreur suivante

Get-PnPFile : Les méthodes WriteObject et WriteError ne peuvent pas être appelées en dehors des substitutions des méthodes BeginProcessing, ProcessRecord et EndProcessing, et elles ne peuvent être appelées que dans le même thread. Vérifiez que la cmdlet effectue ces appels correctement, ou contactez les services de support clientèle de Microsoft.

lors de l'exécution de ce script 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    
        # Éviter les dossiers Forms
        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
        }
    }
}

# Télécharger les fichiers racine
ProcessFolder $listUrl $destination + "\" 
# Télécharger les fichiers dans les dossiers
$tempfolders = Get-PnPProperty -ClientObject $list.RootFolder -Property Folders
ProcessSubFolders $tempfolders $destination + "\"

Ce script fonctionne comme prévu sur un PC Win10 mais pas sur un serveur Win. Quelqu'un peut-il me dire quelle pourrait en être la raison s'il vous plaît?

0voto

Après avoir réessayé ce matin, le script ci-dessus fonctionne à la fois sur un PC Windows 10 et sur un serveur Windows,

Alexandra

0voto

hairy_marmite Points 109

Cela peut aider les personnes à la recherche de cette exception exacte, dans certains cas. L'Exception ne semble pas expliquer ce qui se passait réellement, voici donc quelques informations pour que les gens puissent voir si la situation est similaire à la mienne :

Elle a été générée lorsque j'utilisais Powershell et Get-PNPFile pour obtenir des fichiers en vrac à partir d'un site Sharepoint. Après quelques réflexions, il semblait que cela était lié à l'existence du fichier déjà présent sur le système local suite à un téléchargement précédent. Comme le script était utilisé pour garder une copie locale de certains dossiers sur le site sharepoint, je tentais d'écraser les fichiers localement si les fichiers du serveur étaient plus récents. (Un peu comme un rsync rudimentaire).

Il semble que Get-PnpFile ne remplace pas (écrase silencieusement) le fichier s'il existe déjà, mais génère cette exception. Une synthèse du code qui s'est exécuté sans erreur suit :

Essaye {
           $local_path = ($local_dir + $local_file)
           #teste d'abord la présence du fichier local et le renomme
           if( Test-Path ( $local_path  ) -PathType Leaf ){
               Rename-Item $local_path ($local_path + '.old' )
           }

           #obtient le fichier
           Get-PnpFile -ServerRelativeUrl $file.ServerRelativeUrl -Path $local_dir -FileName $local_file -AsFile

            #supprime l'ancien fichier
           if( Test-Path ( $local_path  ) -PathType Leaf ){

                Remove-Item ($local_path + '.old' )
           }
    }
    Attrape {
           #gère l'erreur et continue
    }

Essentiellement tester d'abord la présence du fichier local et le renommer, télécharger le fichier, supprimer le fichier local renommé. Je l'ai enveloppé dans un bloc Try Catch pour que si le téléchargement échouait pour ce fichier, je puisse continuer dans le cadre d'une boucle et plus tard je pourrais chercher tous les noms de fichiers avec un suffixe .old et récupérer les fichiers locaux les plus récents pour les échecs, en prenant note de ceux-ci.

Lorsque le script a été réexécuté, le script ne verrait plus le fichier distant localement (puisque les noms ne correspondraient pas) et récupérerait une nouvelle copie mais effacerait le fichier .old (de la précédente exécution) s'il parvenait à obtenir le fichier

Je n'ai plus revu l'exception. J'espère que cela aidera quelqu'un.

P.S. (si certains de vos fichiers se terminent en .old des choses étranges/inconnues SE produiront avec la méthode simple ci-dessus... vous avez été prévenu)

Mise à jour Je mettrai à jour ici chaque fois que je verrai une nouvelle cause de cette Exception

Mise à jour Il semblerait que les crochets "[" ou "]" dans le nom de fichier peuvent également causer cela. Peut-être que dans l'URL il faut un encodage d'URL ou un échappement....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X