Suppression en batch de fichiers absent d'une liste

Résolu/Fermé
Angelus_h Messages postés 3 Date d'inscription jeudi 15 avril 2021 Statut Membre Dernière intervention 20 avril 2021 - 15 avril 2021 à 10:03
Angelus_h Messages postés 3 Date d'inscription jeudi 15 avril 2021 Statut Membre Dernière intervention 20 avril 2021 - 20 avril 2021 à 08:21
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.
A voir également:

3 réponses

barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847
15 avril 2021 à 20:08
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
Angelus_h Messages postés 3 Date d'inscription jeudi 15 avril 2021 Statut Membre Dernière intervention 20 avril 2021
19 avril 2021 à 08:18
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
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847
Modifié le 19 avril 2021 à 19:35
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
Angelus_h Messages postés 3 Date d'inscription jeudi 15 avril 2021 Statut Membre Dernière intervention 20 avril 2021
20 avril 2021 à 08:21
Merci beaucoup !

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