chaque fois que j'utilise un logiciel de nettoyage, tout est viré et je me retrouve avec les 3 dossiers d'origine..






Code : Tout sélectionner
# =====================================================================
# JumpLists-Backup.ps1
# Version : 1.0 _ PiB-08-2026
#
# Objet :
# Sauvegarder et restaurer les Jump Lists de Windows 11.
#
# Les Jump Lists sont principalement stockées dans :
#
# %APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations
# %APPDATA%\Microsoft\Windows\Recent\CustomDestinations
#
# ATTENTION :
# Ce script sauvegarde les fichiers utilisés par Windows.
# Il ne cherche pas à analyser ou modifier leur contenu.
#
# Nouveautes de la version 2.0 :
# - Fermeture automatique de l'Explorateur avant restauration
# (les Jump Lists sont verrouillees tant qu'explorer.exe tourne)
# et relance automatique une fois l'operation terminee.
# - Demande de confirmation explicite avant d'ecraser les
# Jump Lists actuelles.
# - Creation automatique des dossiers de destination s'ils
# n'existent pas (evite un echec de Copy-Item).
# - Gestion d'erreurs avec try/catch et compte-rendu du nombre
# de fichiers effectivement copies.
#
# =====================================================================
# ---------------------------------------------------------------------
# CONFIGURATION
# ---------------------------------------------------------------------
# Dossier dans lequel seront enregistrées les sauvegardes.
# Par défaut :
# Documents\Sauvegarde-JumpLists
#
$BackupRoot = Join-Path ([Environment]::GetFolderPath("MyDocuments")) `
"Sauvegarde-JumpLists"
# Emplacement des Jump Lists Windows
$RecentFolder = Join-Path $env:APPDATA "Microsoft\Windows\Recent"
$AutomaticSource = Join-Path $RecentFolder "AutomaticDestinations"
$CustomSource = Join-Path $RecentFolder "CustomDestinations"
# ---------------------------------------------------------------------
# FONCTION : Pause
# ---------------------------------------------------------------------
# Permet simplement d'attendre que l'utilisateur appuie sur Entrée.
#
function Pause-Script {
Write-Host ""
Read-Host "Appuyez sur Entree pour continuer"
}
# ---------------------------------------------------------------------
# FONCTION : Création du dossier principal de sauvegarde
# ---------------------------------------------------------------------
function Initialize-BackupFolder {
if (-not (Test-Path $BackupRoot)) {
New-Item `
-ItemType Directory `
-Path $BackupRoot `
-Force | Out-Null
}
}
# ---------------------------------------------------------------------
# FONCTION : Copie sécurisée d'un dossier avec compte-rendu
# ---------------------------------------------------------------------
# Copie le contenu de $Source vers $Destination.
# Retourne le nombre de fichiers copiés avec succès.
# Les erreurs (fichier verrouillé, accès refusé, etc.) sont
# affichées mais n'interrompent pas le reste du script.
#
function Copy-FolderSafely {
param(
[string]$Source,
[string]$Destination
)
$CopiedCount = 0
if (-not (Test-Path $Source)) {
return $CopiedCount
}
# On s'assure que le dossier de destination existe,
# sinon Copy-Item avec "\*" en source echoue silencieusement.
if (-not (Test-Path $Destination)) {
New-Item `
-ItemType Directory `
-Path $Destination `
-Force | Out-Null
}
$Files = Get-ChildItem -Path $Source -File -ErrorAction SilentlyContinue
foreach ($File in $Files) {
try {
Copy-Item `
-Path $File.FullName `
-Destination $Destination `
-Force `
-ErrorAction Stop
$CopiedCount++
}
catch {
Write-Host " [ERREUR] Impossible de copier $($File.Name) : $($_.Exception.Message)" -ForegroundColor Yellow
}
}
return $CopiedCount
}
# ---------------------------------------------------------------------
# FONCTION : Fermeture de l'Explorateur Windows
# ---------------------------------------------------------------------
# Les fichiers de Jump Lists sont ouverts/verrouillés par explorer.exe
# en permanence. Pour garantir une copie ou une suppression fiable
# (notamment lors de la restauration), on ferme le processus le
# temps de l'operation, puis on le relance systematiquement apres,
# meme en cas d'erreur (bloc finally cote appelant).
#
function Stop-WindowsExplorer {
Write-Host "Fermeture de l'Explorateur Windows..."
try {
Stop-Process -Name "explorer" -Force -ErrorAction Stop
# Petite pause pour laisser le temps au processus de
# relacher completement les fichiers.
Start-Sleep -Milliseconds 1500
}
catch {
Write-Host " [AVERTISSEMENT] Impossible de fermer l'Explorateur : $($_.Exception.Message)" -ForegroundColor Yellow
}
}
# ---------------------------------------------------------------------
# FONCTION : Relance de l'Explorateur Windows
# ---------------------------------------------------------------------
function Start-WindowsExplorer {
Write-Host "Relance de l'Explorateur Windows..."
# Si explorer.exe tourne deja (cas rare), on ne relance pas
# une deuxieme instance inutilement.
$AlreadyRunning = Get-Process -Name "explorer" -ErrorAction SilentlyContinue
if (-not $AlreadyRunning) {
Start-Process "explorer.exe"
Start-Sleep -Milliseconds 1000
}
}
# ---------------------------------------------------------------------
# FONCTION : Sauvegarde des Jump Lists
# ---------------------------------------------------------------------
function Backup-JumpLists {
Clear-Host
Write-Host "=========================================="
Write-Host " SAUVEGARDE DES JUMP LISTS"
Write-Host "=========================================="
Write-Host ""
Initialize-BackupFolder
# Création d'un nom de dossier contenant la date et l'heure.
#
# Exemple :
# Backup_2026-08-14_10-30-00
#
$Date = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
$BackupFolder = Join-Path $BackupRoot "Backup_$Date"
# Création du dossier de sauvegarde
New-Item `
-ItemType Directory `
-Path $BackupFolder `
-Force | Out-Null
# -------------------------------------------------------------
# Sauvegarde des AutomaticDestinations et CustomDestinations
# -------------------------------------------------------------
#
# Remarque : la sauvegarde (simple lecture) ne necessite pas
# de fermer l'Explorateur. Seule la restauration (ecriture /
# suppression) l'exige vraiment. On copie donc directement.
Write-Host "Sauvegarde de AutomaticDestinations..."
$AutomaticBackupFolder = Join-Path $BackupFolder "AutomaticDestinations"
$CountAuto = Copy-FolderSafely -Source $AutomaticSource -Destination $AutomaticBackupFolder
if ($CountAuto -eq 0 -and -not (Test-Path $AutomaticSource)) {
Write-Host " Dossier AutomaticDestinations introuvable."
}
else {
Write-Host " $CountAuto fichier(s) copie(s)."
}
Write-Host "Sauvegarde de CustomDestinations..."
$CustomBackupFolder = Join-Path $BackupFolder "CustomDestinations"
$CountCustom = Copy-FolderSafely -Source $CustomSource -Destination $CustomBackupFolder
if ($CountCustom -eq 0 -and -not (Test-Path $CustomSource)) {
Write-Host " Dossier CustomDestinations introuvable."
}
else {
Write-Host " $CountCustom fichier(s) copie(s)."
}
Write-Host ""
Write-Host "Sauvegarde terminee."
Write-Host ""
Write-Host "Emplacement :"
Write-Host $BackupFolder
Pause-Script
}
# ---------------------------------------------------------------------
# FONCTION : Restauration des Jump Lists
# ---------------------------------------------------------------------
function Restore-JumpLists {
Clear-Host
Write-Host "=========================================="
Write-Host " RESTAURATION DES JUMP LISTS"
Write-Host "=========================================="
Write-Host ""
# Vérification de l'existence du dossier principal
if (-not (Test-Path $BackupRoot)) {
Write-Host "Aucune sauvegarde disponible."
Pause-Script
return
}
# Recherche de toutes les sauvegardes existantes
# (on exclut les dossiers "Avant_Restauration_*" qui sont des
# sauvegardes de securite techniques, pas des sauvegardes
# a proposer pour une restauration manuelle)
$Backups = Get-ChildItem `
-Path $BackupRoot `
-Directory `
-Filter "Backup_*" |
Sort-Object Name -Descending
if ($Backups.Count -eq 0) {
Write-Host "Aucune sauvegarde disponible."
Pause-Script
return
}
# -------------------------------------------------------------
# Affichage des sauvegardes disponibles
# -------------------------------------------------------------
Write-Host "Sauvegardes disponibles :"
Write-Host ""
for ($i = 0; $i -lt $Backups.Count; $i++) {
Write-Host "[$($i + 1)] $($Backups[$i].Name)"
}
Write-Host ""
$Choice = Read-Host "Numero de la sauvegarde a restaurer"
# Vérification de la saisie
$Number = 0
if (-not [int]::TryParse($Choice, [ref]$Number)) {
Write-Host ""
Write-Host "Choix incorrect."
Pause-Script
return
}
if (($Number -lt 1) -or ($Number -gt $Backups.Count)) {
Write-Host ""
Write-Host "Choix incorrect."
Pause-Script
return
}
$SelectedBackup = $Backups[$Number - 1].FullName
# -------------------------------------------------------------
# Confirmation explicite avant d'écraser les données actuelles
# -------------------------------------------------------------
Write-Host ""
Write-Host "Vous allez restaurer : $($Backups[$Number - 1].Name)" -ForegroundColor Cyan
Write-Host "Cette operation va REMPLACER vos Jump Lists actuelles." -ForegroundColor Cyan
Write-Host "L'Explorateur Windows va etre ferme puis relance automatiquement." -ForegroundColor Cyan
Write-Host ""
$Confirm = Read-Host "Confirmer la restauration ? (O/N)"
if ($Confirm -notmatch "^[Oo]$") {
Write-Host ""
Write-Host "Restauration annulee."
Pause-Script
return
}
# -------------------------------------------------------------
# Fermeture de l'Explorateur pour liberer les fichiers verrouilles
# -------------------------------------------------------------
#
# On utilise try/finally : quoi qu'il arrive pendant la
# restauration (erreur, interruption...), l'Explorateur sera
# systematiquement relance a la fin.
Stop-WindowsExplorer
try {
# ---------------------------------------------------------
# Sauvegarde de sécurité avant restauration
# ---------------------------------------------------------
#
# Très important :
# avant d'écraser les Jump Lists actuelles, nous en faisons
# automatiquement une copie.
$SafetyDate = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
$SafetyFolder = Join-Path `
$BackupRoot `
"Avant_Restauration_$SafetyDate"
New-Item `
-ItemType Directory `
-Path $SafetyFolder `
-Force | Out-Null
Write-Host ""
Write-Host "Sauvegarde de securite de l'etat actuel..."
$SafetyAutoFolder = Join-Path $SafetyFolder "AutomaticDestinations"
$SafetyCustomFolder = Join-Path $SafetyFolder "CustomDestinations"
Copy-FolderSafely -Source $AutomaticSource -Destination $SafetyAutoFolder | Out-Null
Copy-FolderSafely -Source $CustomSource -Destination $SafetyCustomFolder | Out-Null
# ---------------------------------------------------------
# Restauration
# ---------------------------------------------------------
Write-Host "Restauration en cours..."
$AutomaticBackup = Join-Path $SelectedBackup "AutomaticDestinations"
$CustomBackup = Join-Path $SelectedBackup "CustomDestinations"
# AutomaticDestinations
if (Test-Path $AutomaticBackup) {
# On s'assure que le dossier cible existe (il devrait
# toujours exister sous Windows, mais on securise).
if (-not (Test-Path $AutomaticSource)) {
New-Item `
-ItemType Directory `
-Path $AutomaticSource `
-Force | Out-Null
}
# Suppression du contenu actuel
Remove-Item `
"$AutomaticSource\*" `
-Force `
-ErrorAction SilentlyContinue
# Copie de la sauvegarde
$RestoredAuto = Copy-FolderSafely -Source $AutomaticBackup -Destination $AutomaticSource
Write-Host " AutomaticDestinations : $RestoredAuto fichier(s) restaure(s)."
}
# CustomDestinations
if (Test-Path $CustomBackup) {
if (-not (Test-Path $CustomSource)) {
New-Item `
-ItemType Directory `
-Path $CustomSource `
-Force | Out-Null
}
Remove-Item `
"$CustomSource\*" `
-Force `
-ErrorAction SilentlyContinue
$RestoredCustom = Copy-FolderSafely -Source $CustomBackup -Destination $CustomSource
Write-Host " CustomDestinations : $RestoredCustom fichier(s) restaure(s)."
}
Write-Host ""
Write-Host "Restauration terminee."
Write-Host ""
Write-Host "Une sauvegarde de securite a ete creee dans :"
Write-Host $SafetyFolder
}
finally {
# Quoi qu'il arrive (succes ou erreur), on relance
# systematiquement l'Explorateur Windows.
Start-WindowsExplorer
}
Write-Host ""
Pause-Script
}
# =====================================================================
# MENU PRINCIPAL
# =====================================================================
do {
Clear-Host
Write-Host "=========================================="
Write-Host " JUMP LISTS BACKUP - V1.0"
Write-Host " Windows 11"
Write-Host "=========================================="
Write-Host ""
Write-Host "[1] Sauvegarder les Jump Lists"
Write-Host "[2] Restaurer les Jump Lists"
Write-Host "[3] Ouvrir le dossier des sauvegardes"
Write-Host "[4] Quitter"
Write-Host ""
$MenuChoice = Read-Host "Votre choix"
switch ($MenuChoice) {
"1" {
Backup-JumpLists
}
"2" {
Restore-JumpLists
}
"3" {
Initialize-BackupFolder
Start-Process explorer.exe $BackupRoot
}
"4" {
Write-Host ""
Write-Host "Fin du programme."
}
default {
Write-Host ""
Write-Host "Choix incorrect."
Start-Sleep -Seconds 1
}
}
}
while ($MenuChoice -ne "4")
Code : Tout sélectionner
del /f /q /s /a "%AppData%\Microsoft\Windows\Recent\*.*" >nul 2>&1
del /s /f /q /a "%AppData%\Microsoft\Windows\Recent\AutomaticDestinations\*.*" >nul 2>&1
del /s /f /q /a "%AppData%\Microsoft\Windows\Recent\CustomDestinations\*.*" >nul 2>&1