Script pour supprimer automatiquement les plus vieux dossiers

Résolu/Fermé
anakin6661 Messages postés 87 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 5 avril 2022 - 11 mai 2017 à 11:04
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 - 12 mai 2017 à 17:13
Bonjour,

J'ai encore besoin d'un coup de main concernant un script pour automatiser une suppression de sous dossier.
De façon automatique, une fois par semaine, un nouveau sous dossier est créé par robocopy (sauvegarde d'un dossier partagé) sur un NAS Western Digital.
Pour ne pas saturer le NAS destinataire de ces sauvegardes, je cherche à mettre en place un script sur un de nos serveur en tache planifié.
Le dossier contient une dizaine de sous dossier de 250Go environ.
Je cherche à automatiser la suppression du plus vieux dossier.
Nous sommes obligé de passer par robocopy et non par un logiciel style cobian car le système shadow copy est déjà utilisé sur le serveur de fichier pour une autre sauvegarde.

Je bute totalement sur la façon de sélectionner le sous dossier le plus anciens
un problème est aussi à prendre en compte, la sélection doit ce passer à la racine de ce dossier et ne pas entrer dans les sous dossiers contenant encore toute une multitude de dossier, etc ... pour ne pas supprimer des dossiers ailleurs que le plus vieux sous dossier.
Nous avions trouvé un fichier vbs qui nous sélectionnait le plus vieux dossier mais qui n'arrivait pas à supprimer sur le NAS (question de droit en tache planifié)
Ne sachant pas comment mettre les informations de connexion sur un vbs, je suis obligé de passer par un .bat
à moins que quelqu'un m'apporte des éclaircissement sur le vbs qui m'est totalement inconnu

Le vbs que j'ai essayé d'utiliser:

Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set MonRep=FSO.GetFolder("D:\MonDossier")

datemin = Date()

for each sf in monrep.subfolders
If sf.datelastmodified < datemin then
datemin = sf.datelastmodified
chemin = sf.path
end if
next

set rep_to_delete = FSO.GetFolder(chemin)

rep_to_delete.delete

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
Modifié le 12 mai 2017 à 17:14
Dans mon script, PUSHD permet de monter un lecteur réseau temporaire, sans authentification.

Si jamais tu as besoin de t'authentifier auprès du NAS, il faut utiliser la commande NET USE :
Setlocal enableextensions enabledelayedexpansion

net use * \\adresse_NAS\nom_du_partage /user:user password

cd /d Z: (il faut indiquer la lettre du lecteur réseau, Z: par exemple)

for /F "tokens=*" %%A in ('dir /b /ad /o-d "*.*"') do (set cible=%%~nA)

rmdir /S /Q "!cible!"

Endlocal

exit
1
daminator25 Messages postés 3324 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 25 janvier 2020 305
11 mai 2017 à 11:15
Bonjour,

Et tu ne peux pas numéroter tes dossiers ou y inscrire la date dans le nom ?
Ainsi il serait très simple de détecter le plus ancien.
0
anakin6661 Messages postés 87 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 5 avril 2022 6
11 mai 2017 à 11:46
La sauvegarde est exporté dans un dossier renommé en fonction de la date de création de la sauvegarde, "%year%%month%%day%Nom_Dossier"
1 sauvegarde par semaine, mais je bloque pour la sélection du dossier par le nom ou par la date de création
0
anakin6661 Messages postés 87 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 5 avril 2022 6
11 mai 2017 à 11:49
NB: merci d'avoir déplacé le sujet dans la bonne section
0
daminator25 Messages postés 3324 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 25 janvier 2020 305
11 mai 2017 à 12:15
Malheureusement je ne connais pas bien les batch je ne saurais te conseiller. J'ai plutot une logique POO et en batch c'est pas tout a fait ça ...
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 11 mai 2017 à 13:54
Bonjour,

Je ne peux pas t'aider pour ton script VBS, par contre c'est très simple de trouver le plus vieux dossier en batch :

dir /ad /od ton dossier

Le commutateur /AD permet de cibler les dossiers et donc d'exclure les fichiers.

Le commutateur /OD permet de lister par ordre chronologique, en tenant compte de la date de dernière modification, pas de la date de création.

Tu associes cette commande à une boucle for pour pouvoir stocker le "dossier le plus vieux" dans une variable appelée !cible! :

Setlocal enableextensions enabledelayedexpansion

set dossier=nom de ton dossier

pushd %dossier%

for /F "tokens=*" %%A in ('dir /b /ad /od "*.*"') do (set cible=%%~nA)

rmdir /S /Q "!cible!"

popd

Endlocal

exit

Sauf que la commande RMDIR n'effacera pas le dossier si celui-ci n'est pas vide, par conséquent je te suggère de passer par une commande externe telle que del3.exe à télécharger ici :

http://www.info2000.biz/download/del3.zip

Donc la ligne avec la commande RMDIR sera à remplacer par celle-là :
del3.exe /b "!cible!"
0
anakin6661 Messages postés 87 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 5 avril 2022 6
12 mai 2017 à 10:34
Je viens de tester, ça supprime le dossier le plus récemment modifié et non le plus ancien.
Mais déjà ça sélectionne un dossier, de quoi m'aider à trouver comment définir le bon dossier.
J'en suis donc bien plus loin qu'avant, Merci
0
barnabe0057 > anakin6661 Messages postés 87 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 5 avril 2022
12 mai 2017 à 12:56
Oups ! Oui effectivement j'ai fait l'inverse, voilà la correction :
Setlocal enableextensions enabledelayedexpansion

set dossier=nom de ton dossier

pushd %dossier%

for /F "tokens=*" %%A in ('dir /b /ad /o-d "*.*"') do (set cible=%%~nA)

rmdir /S /Q "!cible!"

popd

Endlocal

exit
0
anakin6661 Messages postés 87 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 5 avril 2022 6
12 mai 2017 à 14:08
Merci pour la correction.
Ça fonctionne parfaitement en local, maintenant je vais tester la semaine prochaine sur une tache planifiée si la suppression du fichier le plus ancien passe sur le NAS western Digital
Je te tiens au jus
0
anakin6661 Messages postés 87 Date d'inscription samedi 30 septembre 2006 Statut Membre Dernière intervention 5 avril 2022 6
Modifié le 12 mai 2017 à 14:26
Pour la création des dossiers de test, voila ce que j'ai utilisé:

echo off
cls

echo ---------------------------------------------------------------------------
echo Instructions
echo ---------------------------------------------------------------------------

echo Pour effectuer les tests, j'ai besoin de
echo - un dossier moins anciens que la date
echo - plusieurs dossiers plus anciens que la date
echo dans le dossier moins anciens que la date, je dois avoir plusieurs sous dossiers plus anciens et moins anciens que la date

echo Notre date de reference sera le 12/05/2017

echo ---------------------------------------------------------------------------
echo creation du dossier moins anciens
echo ---------------------------------------------------------------------------

echo creation du dossier recent
md C:\Scripts\Test_suppression_dossier\dossier_recent
echo le dossier plus anciens est maintenant cree

echo ---------------------------------------------------------------------------
echo création des dossiers et sous dossiers plus anciens
echo ---------------------------------------------------------------------------
echo.
echo avant nous devons garder la référence du jours :
echo definition du jour
SET day=%date:~0,2%

echo definition du mois
SET month=%date:~3,2%

echo definition de l annee
SET year=%date:~6,4%

echo dossier et sous dossier 1 ***********************

echo configuration de la date plus ancienne
date 01/04/2017
echo création du dossier
md C:\Scripts\Test_suppression_dossier\dossier_ancien1
md C:\Scripts\Test_suppression_dossier\dossier_ancien1\sous_dossier_ancien1
echo le dossier plus anciens est maintenant cree
echo.

echo création du sous dossier ancien
md C:\Scripts\Test_suppression_dossier\dossier_recent\sous_dossier_ancien1
echo le sous dossier est maintenant cree
echo.

echo dossier et sous dossier 2 **********************

echo configuration de la date plus ancienne
date 01/03/2017
echo création du dossier
md C:\Scripts\Test_suppression_dossier\dossier_ancien2
md C:\Scripts\Test_suppression_dossier\dossier_ancien2\sous_dossier_ancien2
echo le dossier plus anciens est maintenant cree
echo.

echo création du sous dossier ancien
md C:\Scripts\Test_suppression_dossier\dossier_recent\sous_dossier_ancien2
echo le sous dossier est maintenant cree
echo.

echo dossier et sous dossier 3 **********************

echo configuration de la date plus ancienne
date 01/02/2017
echo création du dossier
md C:\Scripts\Test_suppression_dossier\dossier_ancien3
md C:\Scripts\Test_suppression_dossier\dossier_ancien3\sous_dossier_ancien3
echo le dossier plus anciens est maintenant cree
echo.

echo création du sous dossier ancien
md C:\Scripts\Test_suppression_dossier\dossier_recent\sous_dossier_ancien3
echo le sous dossier est maintenant cree
echo.

echo reconfiguration de l'ordinateur a la date du jours **************
date %day%/%month%/%year%
echo verification du retour a la date du jour
date /t
echo.

echo création du sous dossier recent
md C:\Scripts\Test_suppression_dossier\dossier_recent\sous_dossier_recent
echo le sous dossier est maintenant cree
echo.

echo le dossier est maintenant pret pour les tests



pause
0