Depuis mars 2024, l’action « Déplacer vers / Copier vers » de SharePoint Online ne propose plus toujours la boîte « Remplacer ou conserver les deux », et des fichier(1).ext apparaissent. Voici les impacts, constats et des contournements fiables pour garder la maîtrise des mises à jour.
Problématique
Depuis la mise à jour de mars 2024, l’action Déplacer vers / Copier vers dans une bibliothèque SharePoint Online n’affiche plus de façon systématique la boîte de dialogue « Remplacer ou conserver les deux » lorsqu’un fichier du même nom est déjà présent dans le dossier cible. Au lieu de proposer l’écrasement (replace), le service crée une copie avec un suffixe (1)
, (2)
, etc. Cette duplication :
- perturbe les processus utilisateurs (on ne sait plus quelle « version » est la bonne) et casse des liens partagés (liens qui pointent vers l’original) ;
- complique les flux Power Automate (beaucoup de logiques reposent sur des noms de fichiers stables) ;
- n’a pas été documentée de manière officielle au moment de l’apparition et résulte d’un déploiement côté service rapporté par des administrateurs (échanges dans la communauté Microsoft).
Constats techniques
Observation | Détails |
---|---|
Portée | Effet variable : certains tenants voient le nouveau comportement, d’autres non ; le phénomène a débuté autour du 20 mars 2024. |
Versioning | Activer ou désactiver le versionnage n’influe pas sur ce conflit. |
Upload direct | La boîte « Remplacer » est encore proposée lorsqu’on téléverse un fichier depuis le poste local (glisser‑déposer ou bouton Charger). |
Rétablissement partiel | Des locataires indiquent le retour de la boîte de dialogue à partir de mi‑mai 2024 ; la correction est donc graduelle. |
Comment reconnaître le nouveau comportement
- Depuis une bibliothèque, sélectionnez un fichier existant ou un ensemble de fichiers.
- Cliquez sur Copier vers (ou Déplacer vers) et choisissez un dossier cible où le même nom existe déjà.
- Si la boîte « Remplacer ou conserver les deux » n’apparaît pas, SharePoint crée immédiatement
NomDeFichier(1).ext
(ou(2)
, etc.). - Dans l’historique des versions, vous ne voyez aucune nouvelle version du fichier original : il s’agit bien d’une nouvelle copie, pas d’un écrasement contrôlé.
Impacts concrets sur les usages
- Liens périmés : les liens de partage pointent l’original, alors que l’utilisateur croit avoir « mis à jour » le document. La copie
(1)
n’est pas référencée par ces liens. - Confusion documentaire : co‑existence de documents quasi identiques, indexation et recherche bruitées, risque de travailler sur une mauvaise version.
- Automatisation fragilisée : des flux Power Automate déclenchés « à l’arrivée d’un fichier nommé X » ne se déclenchent plus (le fichier s’appelle désormais
X(1)
). - Gouvernance : quotas de stockage et rétention compliqués par des doublons en cascade.
Contournements et bonnes pratiques
Cas d’usage | Solution recommandée | Résultat / limite |
---|---|---|
Mise à jour manuelle ponctuelle | Charger le fichier et cliquer sur Remplacer | Conserve l’historique des versions, aucun doublon. |
Travail via l’Explorateur | OneDrive Sync : écraser le fichier local | Une nouvelle version est poussée, pas de copie « (1) ». |
Automatisation | Dans Power Automate : • action Update file ; • ou action Create file avec If-None-Match = "*" | Écrasement contrôlé, pas de duplication. |
Script / code | API Graph ou REST avec @microsoft.graph.conflictBehavior=replace | Force le replace côté service. |
Processus manuel Copie/Déplacement | Supprimer d’abord la cible, puis Copier | Deux étapes ; risque de perte si suppression erronée. |
Impact majeur | Ouvrir un ticket via le Centre d’administration M365 | Permet d’associer votre tenant à l’incident actif. |
Procédure A – Upload + Remplacer (manuel, sûr)
- Dans la bibliothèque, cliquez sur Charger > Fichiers, ou faites un glisser‑déposer.
- Lorsque le nom existe déjà, la boîte « Remplacer » s’affiche.
- Choisissez Remplacer. SharePoint crée une nouvelle version du fichier (même URL), sans copie
(1)
.
Bon à savoir : le versionnage doit être activé pour conserver l’historique (recommandé). Mais même sans versionnage, l’Upload + Remplacer n’engendre pas de doublon.
Procédure B – OneDrive Sync (poste de travail)
- Dans la bibliothèque, cliquez sur Synchroniser (OneDrive).
- Dans l’Explorateur, ouvrez le dossier synchronisé, remplacez le fichier local par la nouvelle version (copier/coller).
- Le client OneDrive pousse la mise à jour : côté SharePoint, une nouvelle version est ajoutée, sans fichier
(1)
.
Astuce : vérifiez dans l’historique des versions que l’incrément a bien eu lieu (utile pour les équipes support).
Procédure C – Power Automate (écrasement contrôlé)
Deux approches simples, stables et idempotentes :
- Mettre à jour un fichier existant
Usage : vous connaissez l’URL/le chemin du fichier à remplacer.- Déclencheur (au choix) : manuel, planifié, ou « Quand un fichier est créé/modifié » dans la bibliothèque source.
- Action Get file content (source), puis Update file (cible) en pointant vers le même chemin et nom.
- Option avancée : ajoutez un en‑tête
If-Match
avec l’ETag courant si vous voulez bloquer l’écrasement en cas de modification concurrente (retournera412 Precondition Failed
).
- Créer si absent, sinon refuser pour éviter les copies
Usage : vous publiez un fichier et souhaitez empêcher toute création si le nom existe déjà.- Action Create file (SharePoint) + en‑tête
If-None-Match: "*"
. - Si le fichier existe, SharePoint renvoie
412
. Gérez ce cas (branche Condition) pour déclencher une Update file, ou pour alerter.
- Action Create file (SharePoint) + en‑tête
Conseil d’implémentation : organisez vos flux en « Try Create » puis « On Conflict → Update ». Ce patron évite définitivement les (1)
.
Procédure D – API Graph / REST (développeurs & scripts)
Microsoft Graph permet de forcer explicitement l’écrasement via le paramètre @microsoft.graph.conflictBehavior=replace
lors d’un PUT
sur /content
. Exemple en curl
:
curl -X PUT ^
-H "Authorization: Bearer <TOKEN>" ^
-H "Content-Type: application/octet-stream" ^
--data-binary "@Contrat.docx" ^
"https://graph.microsoft.com/v1.0/sites/{site-id}/drives/{drive-id}/root:/Dossiers/Contrat.docx:/content?@microsoft.graph.conflictBehavior=replace"
Notes :
replace
écrase le fichier et crée une nouvelle version, sans changer l’URL.- Vous pouvez aussi utiliser l’en‑tête
If-Match
avec l’ETag pour contrôler la concurrence : remplacer uniquement si personne ne l’a modifié entre‑temps.
REST SharePoint (exemple PowerShell) :
# Ajout/écrasement via REST (_api) : overwrite=true
$site = "https://contoso.sharepoint.com/sites/Equipe"
$lib = "Shared Documents/Dossiers"
$file = "Contrat.docx"
$bytes = [System.IO.File]::ReadAllBytes("C:\temp\Contrat.docx")
$uri = "$site/_api/web/GetFolderByServerRelativeUrl('/sites/Equipe/$lib')/Files/add(url='$file',overwrite=true)"
# L'authentification dépend de votre contexte (PnP, MSAL, etc.)
Invoke-RestMethod -Method Post -Uri $uri -Body $bytes -Headers @{
"Accept"="application/json;odata=nometadata"
"Content-Type"="application/octet-stream"
}
Détection et nettoyage des doublons
En attendant la correction complète côté service, ciblez les fichier(1).ext
pour informer et nettoyer. Ne supprimez jamais automatiquement sans revue humaine : ces copies peuvent avoir été modifiées après leur création.
Lister les doublons avec PnP PowerShell
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/Equipe" -Interactive
# Parcours de la bibliothèque "Documents partagés"
$items = Get-PnPListItem -List "Documents" -PageSize 2000 -Fields "FileLeafRef","FileRef","Modified","Author"
$dups = foreach($i in $items){
$leaf = $i["FileLeafRef"]
if($leaf -match "(\d+).\w+$"){ # Repère Nom(1).ext, Nom(2).ext, etc.
[PSCustomObject]@{
FileName = $leaf
Path = $i["FileRef"]
Modified = $i["Modified"]
Author = $i["Author"].LookupValue
}
}
}
$dups | Sort-Object Path | Export-Csv ".\doublons-sharepoint.csv" -NoTypeInformation -Encoding UTF8
Write-Host "Export terminé : doublons-sharepoint.csv"
Variante : remontez également la taille et l’ETag pour identifier les copies strictement identiques.
Comparer la copie à l’original
Souvent le duo MonDoc.docx
/ MonDoc(1).docx
coexiste dans le même dossier. Pour repérer les couples et aider la revue :
# Approche simple : même nom "sans suffixe", même dossier
$groupes = $items | Group-Object {
($_.FieldValues.FileRef -replace '\(\d+\)(\.\w+)$','$1') # normalise Nom(1).ext -> Nom.ext
}
$groupes | Where-Object { $*.Count -gt 1 } |
ForEach-Object {
$*.Group | Select-Object @{n='Original';e={($*.FieldValues.FileRef -replace '(\d+)(.\w+)$','$1')}}, ` @{n='Copie';e={$_.FieldValues.FileRef}},`
@{n='Modified';e={$*.FieldValues.Modified}}
} | Export-Csv ".\paires-possibles.csv" -NoTypeInformation
Ce fichier paires-possibles.csv
sert de base à une revue métier (propriétaires de sites) pour décider quelle version conserver.
Bonnes pratiques de prévention
- Nomenclature unique : intégrez date/heure ou n° de révision au nom (
Contrat_2024-03-30_v03.docx
), afin d’éviter les collisions. - Détection périodique : planifiez un script PnP hebdomadaire pour lister les filename(1).ext et alerter les propriétaires.
- Surveillance : vérifiez régulièrement le Message Center de M365 pour un avis de service (préfixe « SP… ») relatif au « File replace dialog ».
- Communication interne : publiez une consigne simple : « si vous devez mettre à jour un fichier existant, utilisez Charger puis Remplacer, pas Copier vers ».
- Gabarits de flux : standardisez un modèle Power Automate « Create‑or‑Update » (avec
If-None-Match
) et référencez‑le dans le centre d’excellence.
Comparatif des actions (résumé opérationnel)
Action utilisateur | But | Résultat attendu | Risque de (1) | Recommandation |
---|---|---|---|---|
Charger un fichier (Upload) | Mettre à jour un document existant | Nouvelle version du même fichier | Faible | Oui (privilégier) |
Déplacer vers / Copier vers | Réorganiser, dupliquer | Copie dans le dossier cible | Élevé (si nom identique) | À éviter pour une mise à jour |
OneDrive Sync (écraser local) | Remplacer le contenu | Nouvelle version côté SPO | Très faible | Oui (poste de travail) |
Power Automate « Update file » | Automatiser l’écrasement | Version incrémentée | Nul | Oui (modèle recommandé) |
Patrons techniques prêts à l’emploi
1) Power Automate : Create‑or‑Update
Objectif : créer le fichier s’il est absent, sinon mettre à jour le fichier existant sans produire de (1)
.
- Get file content (source) – lit le contenu à publier.
- HTTP (SharePoint/Graph) – tentative de création avec précondition :
Method: POST Uri: https://{site}/_api/web/GetFolderByServerRelativeUrl('/sites/Equipe/Shared Documents/Dossiers')/Files/add(url='Contrat.docx',overwrite=false) Headers: If-None-Match: "*" Body: <contenu binaire>
- Condition : si le statut est
412
(existe déjà), exécuter Update file (même chemin / même nom). Sinon, fin.
Pourquoi ça marche ? La précondition If-None-Match
interdit la création si l’élément existe, ce qui empêche toute création d’un Nom(1).ext
.
2) Power Automate : Update‑with‑ETag (anti‑concurrence)
- Get file metadata using path (cible) – récupère l’
ETag
. - Update file (cible) – en ajoutant l’en‑tête
If-Match: <ETag>
via l’action HTTP si nécessaire.
Vous forcez l’écrasement uniquement si le document n’a pas été modifié par un autre entre‑temps, évitant d’écraser involontairement un travail récent.
3) Graph API : upload direct avec replace
Pour des intégrations applicatives, privilégiez PUT .../content?@microsoft.graph.conflictBehavior=replace
(cf. exemple plus haut). C’est explicite, robuste et indépendant des aléas du « Copier vers ».
Points d’attention (gouvernance et conformité)
- Rétention/Legal Hold : un document sous rétention peut refuser l’écrasement. Prévoir la gestion des erreurs (
423 Locked
/403
). - Check‑out obligatoire : si la bibliothèque impose l’extraction, les actions d’écrasement échoueront sans extraction préalable.
- Quotas & archivage : les copies
(1)
gonflent la taille des bibliothèques. Un rapport mensuel de doublons aide à piloter l’archivage. - Liens de partage : rappelez que seul l’écrasement (Upload/Replace, Update file, Graph replace) maintient les liens existants.
FAQ rapide
« Le versionnage change‑t‑il quelque chose ? » Non, le problème est lié à l’action « Copier/Déplacer vers », pas à la gestion des versions. Le versionnage reste néanmoins recommandé.
« Pourquoi ai‑je encore la boîte « Remplacer » pour un glisser‑déposer ? » Parce que le chemin Upload utilise un autre pipeline côté service, qui continue d’afficher la confirmation d’écrasement.
« Le problème est‑il réglé ? » Des retours font état d’un rétablissement progressif depuis mi‑mai 2024 selon les tenants. En pratique, déployez quand même les contournements ci‑dessus : ils resteront valables.
« Existe‑t‑il un paramètre pour réactiver l’ancienne boîte ? » Non, il s’agit d’un comportement côté service, non configurable par l’administrateur.
Plan de remédiation recommandé (pas à pas)
- Informer immédiatement les utilisateurs : pour mettre à jour un document, utiliser Charger > Remplacer (ou OneDrive Sync), et éviter « Copier/ Déplacer vers » pour ce cas d’usage.
- Stabiliser les automatismes : convertir vos flux Copy/Move en Update file ou en Graph PUT replace.
- Surveiller les doublons via un job hebdomadaire (script PnP) et adresser les équipes concernées.
- Nettoyer de manière assistée (revue humaine), en préservant les éventuels écarts significatifs (dates, tailles, versions).
- Suivre le Message Center et relier votre tenant à l’incident Microsoft via un ticket si l’impact reste élevé.
Conseils supplémentaires
- Nomenclature unique : ajoutez date ou numéro de révision dans le nom pour éviter les collisions.
- Détection de doublons : exécutez régulièrement un script PnP PowerShell pour lister les filename(1).ext.
- Surveillance : vérifiez le Message Center pour un avis de service (préfixe SP…) relatif au « File replace dialog ».
- Communication interne : informez vos utilisateurs et propriétaires de sites des contournements disponibles.
En résumé
Le comportement constaté est un changement côté service, non configurable. En attendant la généralisation du correctif :
- privilégiez l’Upload + Remplacer, la mise à jour via OneDrive Sync ou l’Update file automatisé ;
- signalez le problème à Microsoft si votre tenant n’est pas encore corrigé ;
- mettez en place une détection et une procédure de nettoyage des doublons
(1)
.
Annexe : scripts utiles
Export de doublons avec taille et ETag
Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/Equipe" -Interactive
$web = Get-PnPWeb
$list = Get-PnPList -Identity "Documents"
$items = Get-PnPListItem -List $list -PageSize 2000 -Fields "FileLeafRef","FileRef","Modified","Author","SMTotalSize","_UIVersionString","UniqueId"
$dups = foreach($i in $items){
$leaf = $i["FileLeafRef"]
if($leaf -match "(\d+).\w+$"){
$file = Get-PnPFile -Url $i["FileRef"] -AsListItem -ErrorAction SilentlyContinue
[PSCustomObject]@{
FileName = $leaf
ServerPath = $i["FileRef"]
SizeBytes = $i.FieldValues["SMTotalSize"]
Version = $i.FieldValues["_UIVersionString"]
Modified = $i.FieldValues["Modified"]
Author = $i.FieldValues["Author"].LookupValue
Guid = $i.FieldValues["UniqueId"]
}
}
}
$dups | Export-Csv ".\doublons-detail.csv" -NoTypeInformation -Encoding UTF8
Upload forcé (replace) via Graph depuis PowerShell
# Requiert un jeton OAuth 2.0 (Client Credentials ou Device Code)
$token = "<ACCESS_TOKEN>"
$siteId = "<site-id>"
$driveId = "<drive-id>"
$path = "Dossiers/Contrat.docx"
$bytes = [System.IO.File]::ReadAllBytes("C:\temp\Contrat.docx")
$uri = "[https://graph.microsoft.com/v1.0/sites/$siteId/drives/$driveId/root:/$path:/content?@microsoft.graph.conflictBehavior=replace](https://graph.microsoft.com/v1.0/sites/$siteId/drives/$driveId/root:/$path:/content?@microsoft.graph.conflictBehavior=replace)"
Invoke-WebRequest -Method Put -Uri $uri -Headers @{Authorization="Bearer $token"} -Body $bytes -ContentType "application/octet-stream"
Checklist de déploiement (rapide)
- ✅ Informer les utilisateurs (note interne + bannière sur vos sites clés).
- ✅ Mettre à jour les modèles Power Automate (Create‑or‑Update, ETag).
- ✅ Publier un guide « Upload + Remplacer » avec captures d’écran.
- ✅ Planifier un scan hebdomadaire PnP des
(1)
. - ✅ Ouvrir un ticket M365 si votre tenant reste impacté.
Conclusion : même si le comportement historique revient progressivement chez certains, il est prudent d’ancrer des pratiques outils (Upload + Remplacer, Update file, Graph replace) qui préservent les liens, garantissent la traçabilité et éliminent les doublons.