Suppression en batch de fichiers absent d'une liste

Résolu
Bonjour,

Je réalise actuellement un script mais je n'arrive pas à réaliser l'étape principale.

J'ai lié deux dossiers avec un contenu identique :
- un disque origine
- un disque sauvegarde

La mise à jour sur la date la plus récente des deux fonctionnes.
Par contre j'aurais besoin de supprimer les fichiers dans les deux dossiers n'appartenant pas à la première colonne d'un listing.

Le fichier listing.lst est composé ainsi : (la séparation est faite en tabulation)
1	Nom	Prenom	donnee
4 Nom Prenom donnee
5 Nom Prenom donnee
6 Nom Prenom donnee
8 Nom Prenom donnee
10 Nom Prenom donnee


Le dossier est constitué ainsi :
linsting.lst
00000001.DST
00000004.DST
00000005.DST
00000006.DST
00000006.CTS
00000007.DST
00000007.CTS

00000008.DST
00000010.DST


Dans l'exemple ci dessus, l'objectif est de supprimer les fichiers en gras n'appartenant pas à la liste

Le code actuel :
@echo off

setlocal enabledelayedexpansion

set origine="D:\ORIGINE"
set disque="Z:\Sauvegarde"

rem copie du listing le plus récent entre les deux disques

xcopy %origine%\listing.lst %disque%\ /D /Q /Y
xcopy %disque%\listing.lst %origine%\ /D /Q /Y

rem suppression des fichiers *.DST et *.CTS n'appartenant pas à la liste sur les deux disques

........

rem actualisation de l'ensemble des fichiers sur les plus récents

xcopy %origine%\*.* %disque%\ /D /Q /Y
xcopy %disque%\*.* %origine%\ /D /Q /Y


Merci d'avance pour vos réponses, idées ou piste à exploiter.

3 réponses

  1. Bonjour,

    Peut-être comme ça :
    pushd %origine%
    for %%A in (*.CTS *.DST) do findstr "%%~nA" listing.lst >nul || del /f "%%~fA"
    popd
    
    pushd %disque%
    for %%A in (*.CTS *.DST) do findstr "%%~nA" listing.lst >nul || del /f "%%~fA"
    popd


    0
    1. Merci pour cette réponse qui est presque parfaite.
      Si j'ajoute les 0 dans le listing, ça marche.

      Mais le listing n'est pas généré avec les 0

      Les fichiers sont toujours sur 8 caractères (les vides sont remplacés par des 0)
      Exemple :
      00000005.CTS
      00000112.DST
      0
      1. Ok dans ce cas tu peux faire comme ceci :
        @echo off
        
        setlocal enabledelayedexpansion
        
        set "origine=D:\ORIGINE"
        set "disque=Z:\Sauvegarde"
        
        rem copie du listing le plus récent entre les deux disques
        
        xcopy "%origine%\listing.lst" "%disque%\" /D /Q /Y
        xcopy "%disque%\listing.lst" "%origine%\" /D /Q /Y
        
        rem suppression des fichiers *.DST et *.CTS n'appartenant pas à la liste sur les deux disques
        
        call :suppression "%origine%" "%TMP%\listing_bis.txt"
        call :suppression "%disque%" "%TMP%\listing_bis.txt"
        
        rem actualisation de l'ensemble des fichiers sur les plus récents
        
        xcopy "%origine%\*.*" "%disque%\" /D /Q /Y
        xcopy "%disque%\*.*" "%origine%\" /D /Q /Y
        
        exit
        
        :suppression
        
        cd /d %1 & type nul >%2
        
        for /f "tokens=1 delims=	" %%E in (listing.lst) do (
        	set "index=00000000%%~nE"
        	echo.!index:~-8!>>%2
        )
        
        for %%A in (*.CTS *.DST) do find "%%~nA" %2 >nul || del /f "%%~fA"
        
        goto :eof
        0
    2. Merci beaucoup !

      Bonne idée le fichier temporaire, ça marche parfaitement.
      0