Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Besoin d'aide pour *.bat


bloodyxdeath

Messages recommandés

désolée de faire de la pub pour un autre forum.

 

mais, une question de ce genre a été posée (et résolue) sur le forum hardware.fr rubrique programation ==> shell/batch

 

c'était il y'a qqe temps déjà.

 

bonne chance, car le batch n'est pas le langage idéal pour ce genre de pb

Lien vers le commentaire
Partager sur d’autres sites

Bien d'accord, Scuny,

 

et pas de complexes pour citer des topics sérieux et précis qui ont résolu ou fait avancer le sujet dans d''autres forums. L'entraide exclut toute compétition souvent malsaine et toujours au détriment de la valeur technique des réponses ! :P

 

Ceux qui détiennent seuls la "vérité" sont vite à enfermer avant qu'ils ne fassent beaucoup de mal autour d'eux :P

Lien vers le commentaire
Partager sur d’autres sites

Juste un truc : pour le jour où le forum vers lequel on file un lien sera fermé / migré / changé, ça serait tout aussi sympa d'avoir une copie de la réponse, et pas juste un lien.

 

Y'a des questions qui ont toujours la même réponse depuis des années, mais quand on cherche et qu'on ne trouve que des liens vers un article qui a disparu, c'est frustrant....

Lien vers le commentaire
Partager sur d’autres sites

Juste un truc : pour le jour où le forum vers lequel on file un lien sera fermé / migré / changé, ça serait tout aussi sympa d'avoir une copie de la réponse, et pas juste un lien.

 

556958[/snapback]

 

la remarque me parait correct donc voici le post en question

 

 

 

Bonjour, 

Voici un script qui me permet de déplacer des fichiers dont la date de modifications est plus ancienne de 30 jours par rapport a la date d'excution du batch. 
Par contre je ne n'ai pas trouver pour lui dire que s'il y a un repertoire vide, il doit le supprimer. 

Voici l'arborescence que j'ai : 

Dossier 
 | 
 |-Dossier1 
 |    | 
 |    |-Dossier11 
 |    |   | 
 |    |   |-Fichier111 
 |    |   |-Fichiersxx 
 |    | 
 |    |-Dossier12 
 |    |   | 
 |    |   |-Fichier121 
 |    |   |-Fichiersxx  | 
 |    | 
 |    |-Dossierxx 
 |    | 
 |    |-Fichierxx 
 | 
 |-Dossierxx 
 | 
 |-Fichiersxx 

Donc tout plein de repertoires avec tout plein de fichiers partout. 
Le script fouille tout sa et déplace que les fichiers ancien de plus de 30 jours. 

Voici le script : 

:: --------DELOLD.BAT---------- 
@echo off 
rem SET OLDERTHAN=%1 
SET OLDERTHAN=1 
IF NOT DEFINED OLDERTHAN GOTO SYNTAX 
for /f "tokens=1-4 delims=/ " %%i in ('date /t') do (set today=%%l%%j%%k) 
for /f "tokens=2" %%i in ('date /t') do set thedate=%%i 

set mm=%thedate:~0,2% 
set dd=%thedate:~3,2% 
set yyyy=%thedate:~6,4% 

set /A dd=%dd% - %OLDERTHAN% 
set /A mm=%mm% + 0 

if /I %dd% GTR 0 goto DONE 
set /A mm=%mm% - 1 
if /I %mm% GTR 0 goto ADJUSTDAY 
set /A mm=12 
set /A yyyy=%yyyy% - 1 

:ADJUSTDAY 
if %mm%==1 goto SET31 
if %mm%==2 goto LEAPCHK 
if %mm%==3 goto SET31 
if %mm%==4 goto SET30 
if %mm%==5 goto SET31 
if %mm%==6 goto SET30 
if %mm%==7 goto SET31 
if %mm%==8 goto SET31 
if %mm%==9 goto SET30 
if %mm%==10 goto SET31 
if %mm%==11 goto SET30 
if %mm%==12 goto SET31 

goto ERROR 

:SET31 
set /A dd=31 + %dd% 
goto DONE 

:SET30 
set /A dd=30 + %dd% 
goto DONE 

:LEAPCHK 
set /A tt=%yyyy% %% 4 
if not %tt%==0 goto SET28 
set /A tt=%yyyy% %% 100 
if not %tt%==0 goto SET29 
set /A tt=%yyyy% %% 400 
if %tt%==0 goto SET29 

:SET28 
set /A dd=28 + %dd% 
goto DONE 

:SET29 
set /A dd=29 + %dd% 

ONE 
if /i %dd% LSS 10 set dd=0%dd% 
if /I %mm% LSS 10 set mm=0%mm% 
rem for %%i in (*.*) do ( 
for /R D:\Data\Fpublic %%i in (*.*) do ( 
set FileName=%%i 
call ROCESSFILE %%~ti 
) 

set mm= 
set yyyy= 
set dd= 
set thedate= 
goto EXIT 

:SYNTAX 
ECHO. 
ECHO USAGE: 
ECHO DELOLD X 
ECHO   Where X is the number of days previous to Today. 
ECHO. 
ECHO EX: "DELOLD 5" Deletes files older than 5 days. 
GOTO EXIT 

ROCESSFILE 
set temp=%1 
set fyyyy=%temp:~6% 
set fmm=%temp:~0,2% 
set fdd=%temp:~3,2% 
if /I %fyyyy% GTR 2069 set fyyyy=%temp:~6% 


:: +*************************************+ 
:: | This is where the files are deleted | 
:: | Change the ECHO command to DEL to   | 
:: | delete. ECHO is used for test.      | 
:: +*************************************+ 
if /I %fyyyy%/%fmm%/%fdd% LEQ %yyyy%/%mm%/%dd% ( 
Move "%FileName%" D:\Data\Fpublic\Archive\ 
Echo "%FileName%" a ete deplacer dans Archive >> D:\Data\Fpublic\%today%.log 
) 

set temp= 
set fyyyy= 
set fmm= 
set fdd= 

:EXIT 

:: ----------END-DELOLD.BAT------------- 

Merci d'avance de votre aide.... 

  
NIbeck Posté le 04-07-2005 à 11:23:27    Un petit up, 

Ceci est pour une utilisation profesionnel, et je bute réellement, donc si j'amais une ame charitable voulais bien ce pencher sur mon probléme, j'en serais enchanté. 

Cordialement 
alabastro Posté le 18-07-2005 à 12:30:27    Bonjour, 
désolé ce n'est pas pour vous aider mais plutot l'inverse. Je souhaite utiliser votre batch mais je n'arrive pas à le faire fonctionner, sans doute à cause des smilies dans le code. Pouvez-vous m'aider. 
Merci 
NIbeck Posté le 18-07-2005 à 16:18:04    En selectionnant le code et en le collant dans un notepad, cel a ne fonctionne pas? 
alabastro Posté le 18-07-2005 à 17:22:44    NON. 
par exemple devant ONE il y a un smilies. Je pensais qu'il fallait mettre un D à la place pour avoir DONE. Idem pour ROCESSFILE avec : 
nglechau Posté le 18-07-2005 à 21:28:27    Clique sur le bouton Répondre, tu vas pouvoir copier. 
alabastro Posté le 19-07-2005 à 10:36:01    J'ai fais ce que ti m'as dit nglechau mais j'ai l'erreur suivante: "/07 était inattendu" 
Je suis sous Win XP. 

nglechau Posté le 19-07-2005 à 18:51:06    C'est un feature du forum  

Supprime tous les espaces à la fin des lignes et ça ira à mon avis. 
alabastro Posté le 20-07-2005 à 14:08:24    Merci nglechau le script s'execute bien! Par contre il déplace tous les fichiers meme ceux de moins de 30 jours. J'essai de jouer sur le paramètre OLDERTHAN mais j'y arrive pas. 
Merci pour ton aide 

nglechau Posté le 20-07-2005 à 21:03:04    Juste avant la ligne 
if /I %fyyyy%/%fmm%/%fdd% LEQ %yyyy%/%mm%/%dd% ( 
) 

Si tu fais afficher des valeurs calculées, est-ce qu'elles sont correctes ? 
echo %fyyyy%/%fmm%/%fdd%  
echo %yyyy%/%mm%/%dd% 
alabastro Posté le 21-07-2005 à 13:01:04    ça affiche les lignes suivantes: 

2005/07/21 
-7/12/30 

La première ligne c'est bon mais pas la deuxième. ça semble venir dès la recup de la date système mais je ne sais pas ce que font ces 2 lignes 
Code :

for /f "tokens=1-4 delims=/ " %%i in ('date /t') do (set today=%%l%%j%%k) 
for /f "tokens=2" %%i in ('date /t') do set thedate=%%i


  
nglechau Posté le 21-07-2005 à 21:51:35    Tu tapes  
for /? 
dans l'invite de commandes. Ca explique les /f, tokens, etc. 

Quand tu fais : 
date /t 
ou 
echo %DATE% 
depuis l'invite, ça donne quoi ? 
alabastro Posté le 22-07-2005 à 10:31:46    Quand je tape: 
date /t 
ça donne: 
22/07/2005 
et une ligne vide à l'endroit où je tape cette phrase. 

Merci pour ta patience  
nglechau Posté le 22-07-2005 à 10:53:08    Ah oki, tu n'as pas les mêmes options régionnales que l'auteur du topic (lui devait avoir Vendredi 22/07/2005). 

Pour ne pas trop changer le code, remplace le bloc  

Code :

for /f "tokens=2" %%i in ('date /t') do set thedate=%%i


par 
Code :

set thedate=%date%


Tu optimiseras après. 
alabastro Posté le 22-07-2005 à 14:56:40    OUI c'est ça ! 
Ca marche    

Merci bp nglechau 

je ne sais pas ajouter RESOLU au sujet du message !?   
nglechau Posté le 22-07-2005 à 19:58:57    Tu ne peux pas : seul l'auteur du topic le peut  

Bonne continuation  
NIbeck Posté le 27-07-2005 à 10:53:49    je ne vais pas mettre en résolu étant donné que mon probléme n'a pas été réglé, je suis toujours avec le même probléme, c'est à dire que je n'arrive pas àsupprimer les repertoire une foi vide. 
Si quelqu'un a une idée....... 
nglechau Posté le 27-07-2005 à 18:31:40    Tu ajoutes une boucle de vérification à la fin après sauvegardé tous les anciens fichiers, non ? Sinon tu vérifies après le déplacement de chaque. 
NIbeck Posté le 08-08-2005 à 10:20:32    C'est justement cette boucle que je n'arrive pas à faire, si tu as une soluce pour tester si un repertoire est vide, je suis preneur, car là actuellement je n'ai toujorus pas trouver de solution. 
nglechau Posté le 08-08-2005 à 10:53:09    Un dossier est vide si tu fais  
dir /a <dossier> 
ça imprime 7 lignes non-vides ou si tu fais 
dir /b /a <dossier> 
ça ne donne rien. 

Alors si tu initialises une variable avant de faire une boucle pour tester la sortie de la commande dir, et qu'à la sortie de la boucle (en ignorant x lignes selon le cas), elle ne change pas de valeur, alors le dossier est vide. 

Il y a sûrement d'autres méthodes mais c'est ce que je vois vite fait.

--Message édité par nglechau le 08-08-2005 à 10:53:33--  
pascale73 Posté le 19-08-2005 à 18:03:29    Bonjour, 

Aie ! il y a beaucoup de lignes inutiles et quelques erreurs dans ton script ( et que deviennent les 8 et 9 avec le set /a ?) je ne parie pas sur le résultat. 

j'ai essayé de le corriger, mais en fait je pense qu'il faudrait le réécrire complètement et récupérer en variable le nom des fichiers et les nom des répertoires. D'autre part, je ne pense pas qu'il soit possible de réaliser toutes ces opérations dans un seul fichier. 

je vais essayer de le réécrire, mais en attendant, pour info : 

dir /s /b "nom du répertoire racine" >%temp%\liste_fichiers.txt  
permet de lister chemin compris dans le tmp de l'utilisateur tous les fichiers de tous les répertoires. 

dir /a: D /s /b "nom du répertoire racine" >%temp%\liste_rep.txt 
attention : j'ai volontairement mis un espace inutile entre le : et le D pour éviter la génération d'un Smilie indésirable... 
cette commande permet de lister (chemin compris) dans le temp de l'utilisateur tous les répertoires, toutefois la plus grosse difficulté est d'arriver à inverser cette liste pour la rendre utile... 

QUANT À LA QUESTION POSÉE : pour effacer un répertoire il suffit de taper  
RD "nom du répertoire"  
et celui-ci sera effacé s'il est vide, sinon il ne se passera rien. 

l'idée serait avec un premier processus de lister tous les fichiers et en fonction de leurs noms vérifier leurs dates et les déplacer si nécessaire ensuite réaliser un second processus qui efface tous les répertoires également listés en laissant la commande RD se charger de vérifier s'il est véritablement vide. 

Pas si facile à écrire à cause du grand nombre de variables à générer. 
NIbeck Posté le 19-08-2005 à 21:09:29    Merci Pascal pour les infos, mais je ne voit pas les lignes inutil, et encore moins le problémes lié au 8 et 9 ?? 
Ne seraiut il pas plus judicieux (je ne sais si cela est posible) de générer avec la commande dir, un fichier ne contenant que la liste des repertoire (sans le chemin complet) et les fichiers, aprés il devrait être possible de sépararer repertoire et fichiers en se servant come référence du séparateur "\" ? 

Merci encore une fois de l'aide et du travail que tu fournit. 

NIbeck 
pascale73 Posté le 20-08-2005 à 10:21:20    pour compléter ma réponse : 
les lignes que tu peux supprimer sans regrets car elles sont sans objet dans ton cas sont les suivantes :  
rem SET OLDERTHAN=%1 
SET OLDERTHAN=1 
IF NOT DEFINED OLDERTHAN GOTO SYNTAX  

et si tu supprimes la variable, il faut bien entendu la remplacer par sa valeur définie 
set /A dd=%dd% - 30 
'je n'ai pas compris pourquoi tu mets 1 étant donné que c'est 30 que tu veux (peut-être pour tester mais pour cela il y a une meilleure solution : voir + bas) 

ce que tu peux enlever aussi c'est : 
:SYNTAX 
ECHO. 
ECHO USAGE: 
ECHO DELOLD X 
ECHO   Where X is the number of days previous to Today. 
ECHO. 
ECHO EX: "DELOLD 5" Deletes files older than 5 days. 
GOTO EXIT  

des erreurs de syntax de la variable OLDERTHAN tu ne risques pas grand chose si tu la fixes. 

et dernier paragraphe sans objet : 
:: +*************************************+ 
:: | This is where the files are deleted | 
:: | Change the ECHO command to DEL to   | 
:: | delete. ECHO is used for test.      | 
:: +*************************************+  

ou au moins rectifie le par du texte français qui esplique ton opéparion de déplacement de fichier 

je ne comprends pas non plus l'utilité de la première ligne étant donné que tu utilise la seconde uniquement dans : 
for /f "tokens=1-4 delims=/ " %%i in ('date /t') do (set today=%%l%%j%%k) 
for /f "tokens=2" %%i in ('date /t') do set thedate=%%i  


il existe une autre méthode qui te permet de tester ton script dans tous les sens sans changer la date système de ton ordi ou attendre 1 jour !  c'est celle que j'emploie  

(rem) date /t >%temp%\date.txt 
for /f "tokens=1-3 delims=/ " %%i in ('type %temp%\date.txt') do ( 
set jour=%%i 
set mois=%%j 
set an=%%h 
) 
le (rem) permet d'aller bidouiller la date et tester l'opération. 
attention toutefois à bien adapter la longueur des champs  
echo %jour%/%mois%/%an%/ 
me permet de rectifier le tir avec 
set an=%an:~0,4% 
set mois=%mois:~0,2% 
set jour =%jour:~0,2% 

et bien entendu quand tu "recalcules" ta date, c'est aussi très pratique de l'écrire dans un txt, je te le conseille. 

maintenant le problème du 08 et du 09, écris le programme suivant : 

date /t >%temp%\date.txt 
for /f "tokens=1-3 delims=/ " %%a in ('type %temp%\date.txt') do ( 
set jour=%%a 
set mois=%%b 
set an=%%c 
) 
set an=%an:~0,4% 
set mois=%mois:~0,2% 
set jour =%jour:~0,2% 

set /a mois= %mois% + 1 
set /a jour= %jour% + 1  
echo %jour% 
echo %mois% 
pause 

puis mets un rem devant : date /t >%temp%\date.txt 
et modifie la date dans date.txt qui se trouve dans le répertoire temporaire de l'utilisateur en cours et mets 08 et 09  soit pour le jour, soit pour le mois et constates le résultat. toutes les autres dates fonctionnent même le 18, 19 et 28, 29 mais pas ces deux là. 
il faut donc rajouter une commande du type  
if %mois%==08 set /a mois=0010 
if %jour%==09 set /a jour=0011 

dernier point : la commande  
dir /a: D /s /b "nom du répertoire racine" >%temp%\liste_rep.txt 
suivie de  
more /e +n %temp%\lste_rep.txt  
devrait permettre de réordonner les répertoires après avoir compté les lignes... 











 
pascale73 Posté le 21-08-2005 à 08:12:14    apres quelques heures de réflexion, la solution était finalement assez simple, si tu veux balayer une arborescence et effacer les répertoires vides : 
--------- 
@echo off 
@title Effacement de dossiers vides 
@dir /a: d /s /b "c:\dossier"|sort /r >%temp%\list-tri.txt 
@rem liste et trie tous les dossiers (avec leurs chemins) ordre alpha envers 
@rem boucle qui va examinier chaque ligne à partir du début 
@for /f "delims=" %%a in ('type %temp%\list-tri.txt') do call :commande "%%a" 
@rem les "" de %%a sont utiles si le nom des dossiers ont des espaces 
@echo fin de la liste : AU REVOIR ! 
@del "%temp%\list-tri.txt" 
@pause 


:commande 
@set variable=%~1 
@rem commande pas très utile variable sans "" on peut s'en passer 
@echo %variable% 
@rem idem remarque ci-dessus permet de visualiser les dossiers utile uniquement en test 
@rd "%variable%" 


@set variable= 
--------- 
Ca marche pour moi. 
J'espère que ça répond à ta question.   

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...