SharePoint Online : la boîte « Remplacer ou conserver les deux » disparaît (mars 2024) — impacts, causes et contournements

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.

Sommaire

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

ObservationDétails
PortéeEffet variable : certains tenants voient le nouveau comportement, d’autres non ; le phénomène a débuté autour du 20 mars 2024.
VersioningActiver ou désactiver le versionnage n’influe pas sur ce conflit.
Upload directLa 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 partielDes 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

  1. Depuis une bibliothèque, sélectionnez un fichier existant ou un ensemble de fichiers.
  2. Cliquez sur Copier vers (ou Déplacer vers) et choisissez un dossier cible où le même nom existe déjà.
  3. Si la boîte « Remplacer ou conserver les deux » n’apparaît pas, SharePoint crée immédiatement NomDeFichier(1).ext (ou (2), etc.).
  4. 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’usageSolution recommandéeRésultat / limite
Mise à jour manuelle ponctuelleCharger le fichier et cliquer sur RemplacerConserve l’historique des versions, aucun doublon.
Travail via l’ExplorateurOneDrive Sync : écraser le fichier localUne nouvelle version est poussée, pas de copie « (1) ».
AutomatisationDans Power Automate :
• action Update file ;
• ou action Create file avec If-None-Match = "*"
Écrasement contrôlé, pas de duplication.
Script / codeAPI Graph ou REST avec @microsoft.graph.conflictBehavior=replaceForce le replace côté service.
Processus manuel Copie/DéplacementSupprimer d’abord la cible, puis CopierDeux étapes ; risque de perte si suppression erronée.
Impact majeurOuvrir un ticket via le Centre d’administration M365Permet d’associer votre tenant à l’incident actif.

Procédure A – Upload + Remplacer (manuel, sûr)

  1. Dans la bibliothèque, cliquez sur Charger > Fichiers, ou faites un glisser‑déposer.
  2. Lorsque le nom existe déjà, la boîte « Remplacer » s’affiche.
  3. 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)

  1. Dans la bibliothèque, cliquez sur Synchroniser (OneDrive).
  2. Dans l’Explorateur, ouvrez le dossier synchronisé, remplacez le fichier local par la nouvelle version (copier/coller).
  3. 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 :

  1. Mettre à jour un fichier existant
    Usage : vous connaissez l’URL/le chemin du fichier à remplacer.
    1. Déclencheur (au choix) : manuel, planifié, ou « Quand un fichier est créé/modifié » dans la bibliothèque source.
    2. Action Get file content (source), puis Update file (cible) en pointant vers le même chemin et nom.
    3. 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 (retournera 412 Precondition Failed).
  2. 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à.
    1. Action Create file (SharePoint) + en‑tête If-None-Match: "*".
    2. Si le fichier existe, SharePoint renvoie 412. Gérez ce cas (branche Condition) pour déclencher une Update file, ou pour alerter.

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

  1. Nomenclature unique : intégrez date/heure ou n° de révision au nom (Contrat_2024-03-30_v03.docx), afin d’éviter les collisions.
  2. Détection périodique : planifiez un script PnP hebdomadaire pour lister les filename(1).ext et alerter les propriétaires.
  3. Surveillance : vérifiez régulièrement le Message Center de M365 pour un avis de service (préfixe « SP… ») relatif au « File replace dialog ».
  4. Communication interne : publiez une consigne simple : « si vous devez mettre à jour un fichier existant, utilisez Charger puis Remplacer, pas Copier vers ».
  5. 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 utilisateurButRésultat attenduRisque de (1)Recommandation
Charger un fichier (Upload)Mettre à jour un document existantNouvelle version du même fichierFaibleOui (privilégier)
Déplacer vers / Copier versRéorganiser, dupliquerCopie dans le dossier cibleÉlevé (si nom identique)À éviter pour une mise à jour
OneDrive Sync (écraser local)Remplacer le contenuNouvelle version côté SPOTrès faibleOui (poste de travail)
Power Automate « Update file »Automatiser l’écrasementVersion incrémentéeNulOui (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).

  1. Get file content (source) – lit le contenu à publier.
  2. 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>
  3. 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)

  1. Get file metadata using path (cible) – récupère l’ETag.
  2. 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)

  1. 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.
  2. Stabiliser les automatismes : convertir vos flux Copy/Move en Update file ou en Graph PUT replace.
  3. Surveiller les doublons via un job hebdomadaire (script PnP) et adresser les équipes concernées.
  4. Nettoyer de manière assistée (revue humaine), en préservant les éventuels écarts significatifs (dates, tailles, versions).
  5. Suivre le Message Center et relier votre tenant à l’incident Microsoft via un ticket si l’impact reste élevé.

Conseils supplémentaires

  1. Nomenclature unique : ajoutez date ou numéro de révision dans le nom pour éviter les collisions.
  2. Détection de doublons : exécutez régulièrement un script PnP PowerShell pour lister les filename(1).ext.
  3. Surveillance : vérifiez le Message Center pour un avis de service (préfixe SP…) relatif au « File replace dialog ».
  4. 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.

Sommaire