Suppression en batch de fichiers absent d'une liste

Résolu
Angelus_h Messages postés 3 Statut Membre -  
Angelus_h Messages postés 3 Statut Membre -
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. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    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
  2. Angelus_h Messages postés 3 Statut Membre
     
    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. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      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
  3. Angelus_h Messages postés 3 Statut Membre
     
    Merci beaucoup !

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