Meilleur auteur de réponses
Déplacement Wiki OnPrem --> Online - Batch edit

Question
-
Bonjour,
Nous sommes en cours de migration de notre SharePoint OnPrem vers SharePoint Online.
Notre SharePoint OnPrem était initialement un seul site avec toutes les bibliothèques à l'intérieur. L'objectif de la migration en ligne est de créer un site par équipe afin de faciliter la gestion.
Je déplace donc une bibliothèque de pages Wiki depuis un site racine vers un sous-site.
J'ai utilisé l'excellent outil SP Migrator de MessageOps qui bien que plus supporté selon leur site, a très bien fonctionné.
Néanmoins, toutes les images sont brisées étant donné que les liens pointent vers la racine du site.
Je souhaite donc trouver un moyen d'éditer toutes les pages de ma Wiki afin de remplacer les liens images qui pointent à la racine par d'autres qui pointent sur un dossier relatif au sous-site.
J'ai trouvé de nombreux sites qui en parlent, et ai commencé à utiliser CSOM en PowerShell.
Je suis bloqué lors de l'itération sur les pages de la Wiki, et de la récupération de leur contenu pour la recherche/remplacement
Voici mon code :
Je suis déjà authentifié sur le bon site, je récupère la Wiki, je liste tous les items.
$list = $clientContext.Web.Lists.GetByTitle("Wiki Technique") $query = [Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery() $items = $list.GetItems( $query ) $clientContext.Load($list) $clientContext.Load($items) #execute query $clientContext.ExecuteQuery() foreach($item in $items) { $name = $item.DisplayName Write-Host "Page : $name" }
La boucle n'affiche aucun nom de page, les items sont donc bien listés, mais il semble que je ne peux pas accéder à leurs propriétés. Je ne trouve pas non plus de propriété traitant du contenu de la page.
Merci.
R.
Réponses
-
Bonjour,
Essayez plutôt ceci (A adapter en cas de sous-répertoires):
$rootFiles = $list.RootFolder.Files $clientContext.Load($rootFiles) $clientContext.ExecuteQuery() foreach ($file in $rootFiles) { Write-Host $file.Name; Write-Host $file.Title; }
My technical blog on SharePoint || My contributions on the TechNet Gallery
- Modifié Benoit Jester [MVP]MVP, Moderator mercredi 12 novembre 2014 11:20
- Marqué comme réponse Gokan OzcifciMVP lundi 26 janvier 2015 06:57
-
Bonjour,
Dans l'idée, il faut coupler la commande Get-Content avec la commande du replace.
(Il y a pas mal d'exemples disponibles en ligne).
Pour tester, perso je:
- Récupérerais le doc en local
- get-content+replace > nouveau fichier
- Uploaderais le nouveau fichier
My technical blog on SharePoint || My contributions on the TechNet Gallery
- Modifié Benoit Jester [MVP]MVP, Moderator mercredi 19 novembre 2014 17:01
- Marqué comme réponse Gokan OzcifciMVP lundi 26 janvier 2015 06:57
-
J'ai modifié ma boucle comme ceci :
$fileName = $file.Name $fileRelativeURL = $file.get_ServerRelativeUrl(); [Microsoft.SharePoint.Client.FileInformation] $fileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($clientContext,$fileRelativeURL); $target = "$destinationfolder"+"\"+"$fileName" Write-Host "Downloading $fileName to $target" [System.IO.FileStream] $writeStream = [System.IO.File]::Open($target,[System.IO.FileMode]::Create); $fileInfo.Stream.CopyTo($writeStream); $writeStream.Close();
Tous les fichiers récupérés font 4Ko et contiennent tous la même chose : des placeholder aspx.
R.
- Marqué comme réponse Gokan OzcifciMVP lundi 26 janvier 2015 06:57
Toutes les réponses
-
Bonjour,
Essayez plutôt ceci (A adapter en cas de sous-répertoires):
$rootFiles = $list.RootFolder.Files $clientContext.Load($rootFiles) $clientContext.ExecuteQuery() foreach ($file in $rootFiles) { Write-Host $file.Name; Write-Host $file.Title; }
My technical blog on SharePoint || My contributions on the TechNet Gallery
- Modifié Benoit Jester [MVP]MVP, Moderator mercredi 12 novembre 2014 11:20
- Marqué comme réponse Gokan OzcifciMVP lundi 26 janvier 2015 06:57
-
Bonjour,
Essayez plutôt ceci (A adapter en cas de sous-répertoires):
$rootFiles = $list.RootFolder.Files $clientContext.Load($rootFiles) $clientContext.ExecuteQuery() foreach ($file in $rootFiles) { Write-Host $file.Name; Write-Host $file.Title; }
My technical blog on SharePoint || My contributions on the TechNet Gallery
Bonjour,
Ca fonctionne très bien pour itérer sur les documents.
Sauriez-vous comment je peux récupérer le contenu de ces items afin de faire un search/replace dessus svp ?
Merci.
R.
-
Bonjour,
Dans l'idée, il faut coupler la commande Get-Content avec la commande du replace.
(Il y a pas mal d'exemples disponibles en ligne).
Pour tester, perso je:
- Récupérerais le doc en local
- get-content+replace > nouveau fichier
- Uploaderais le nouveau fichier
My technical blog on SharePoint || My contributions on the TechNet Gallery
- Modifié Benoit Jester [MVP]MVP, Moderator mercredi 19 novembre 2014 17:01
- Marqué comme réponse Gokan OzcifciMVP lundi 26 janvier 2015 06:57
-
Bonjour et merci pour votre aide.
Je trouve effectivement beaucoup de litérature, mais en majorité pour du SharePoint 2010 vraissemblablement OnPrem, et j'ai beau essayer de multiples méthodes pour télécharger ces fichier, impossible.
Le plus proche que j'ai trouvé est :
Write-Host $file.Name; $binary = $file.OpenBinary() $stream = New-Object System.IO.FileStream($destinationfolder + "/" + $file.Name), Create $writer = New-Object System.IO.BinaryWriter($stream) $writer.Write($binary) $writer.Close()
Mais $file.OpenBinary n'existe pas, donc plantage au $writer.write.
Il y a une méthode OpenBinaryStream, mais elle ne convient pas non plus, les fichiers téléchargés sont illisibles...
Auriez-vous un lien vers des exemples adaptés à SharePoint Online svp ?
Merci.
R.
-
J'ai modifié ma boucle comme ceci :
$fileName = $file.Name $fileRelativeURL = $file.get_ServerRelativeUrl(); [Microsoft.SharePoint.Client.FileInformation] $fileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($clientContext,$fileRelativeURL); $target = "$destinationfolder"+"\"+"$fileName" Write-Host "Downloading $fileName to $target" [System.IO.FileStream] $writeStream = [System.IO.File]::Open($target,[System.IO.FileMode]::Create); $fileInfo.Stream.CopyTo($writeStream); $writeStream.Close();
Tous les fichiers récupérés font 4Ko et contiennent tous la même chose : des placeholder aspx.
R.
- Marqué comme réponse Gokan OzcifciMVP lundi 26 janvier 2015 06:57