[batch] Amélioration de script

Amélioration de script [batch] - Shell/Batch - Programmation

Marsh Posté le 01-05-2006 à 22:55:41    

Bonsoir.
 
J'ai passé l'après midi à pondre le code suivant :
 

Code :
  1. @echo off 
  2. if "%1"=="" goto fin
  3. xcopy /q /y %1\*.jpg %1\red\
  4. cd %1\red\
  5. @echo Cropping
  6. mogrify -format jpg -gravity Center -crop 80%%x0+0 "*.jpg"
  7. @echo Reduction
  8. mogrify -format jpg -thumbnail 120x90! -quality 80 -antialias "*.jpg"
  9. xcopy /q /y *.jpg ..\..\red\
  10. cd ..\..\
  11. rem Etiquette de fin
  12. :fin


 
Un peu d'explication :
j'ai besoin d'utiliser imageMagik, et donc j'ai créé ce code pour pouvoir générer des vignettes (thumbnails) d'images présentes dans un répertoire.
Je n'utilise pas de boucle car l'outil mogrify permet de modifier toutes les images d'un répertoire (suivant critères), et donc me fait mon traitement.
Cependant il faut savoir que mogrify modifie directement l'image et ne permet pas de créer et de travailler sur une copie (d'où la copie des fichiers avec xcopy).
 
Je voudrais savoir s'il y avait moyen d'améliorer ce script. J'ai encore quelques recherches à faire mais si une âme charitable pouvait m'aider ça serait bien. En fait le truc avec les xcopy c'est pas super beau...
 
Peut-être que une amélioration possible serait d'avoir le fichier batch à la racine (enfin à la racine des rep où il y a les images), et de parcourir les sous répertoires pour effectuer le traitement dans chaque dossier (si la cible n'existe pas déjà).
 
Je ne pense pas que traiter séparément chaque fichier puisse être un avantage, puisque ImageMagick l'implémente tout seul, mais au moins ça serait plus propre. Vous en pensez quoi ?
 
(note : j'ai passé une demie heure à trouver qu'il fallait doubler le % pour pouvoir afficher le caractère, en plus j'étais persuadé d'avoir déjà testé, en vain xD)


Message édité par Dagnan le 01-05-2006 à 23:02:29
Reply

Marsh Posté le 01-05-2006 à 22:55:41   

Reply

Marsh Posté le 01-05-2006 à 23:53:00    

Pourquoi pas comme ça ?
mogrify ...blabla... "%1*.jpg"

Reply

Marsh Posté le 02-05-2006 à 00:01:09    

Euh, pour faire quoi, j'ai pas compris :(.
 
Sinon j'ai modifié mon script et voilà où j'en suis :
 

Code :
  1. @echo off
  2. @dir /a:d /b .\ > liste-rep.txt
  3. @for /f "delims=" %%a in ('type liste-rep.txt') do call :commande "%%a"
  4. @del liste-rep.txt
  5. :commande
  6. @set variable=%~1
  7. rem if "%variable%" == "red" goto fin
  8. @xcopy /q /y ".\%variable%\*.jpg" ".\%variable%\red\"
  9. @rem cd "%variable%\red\"
  10. @rem mogrify -format jpg -gravity Center -crop 80%%x0+0 "*.jpg"
  11. @rem mogrify -format jpg -thumbnail 120x90! -quality 80 -antialias "*.jpg"
  12. @xcopy /q /y ".\%variable%\red\*.jpg" ".\red\"
  13. @rem cd ..\..\
  14. @set variable=
  15. rem :fin


 
Explications :
Il parcourt les sous repertoires, copie les images dans un sous-sous repertoire red, et ensuite copie tous les fichiers de red dans le rep red du répertoire parent (entre les deux copies il y a les traitements, en commentaire).
 
Problèmes :
 
- D'une part, il traite le sous-répertoire red (celui du répertoire parent). J'essai d'éviter cela en verifiant si %variable% ne vaut pas "red" mais ça ne change rien. Pourquoi ?
 
- Avec mogrify, je suis obligé de me déplacer dans les répertoires pour faire la manip, donc ajouter des cd assez moches.
Sinon je peux traiter chaque fichier séparement (avec la liste des fichiers plutôt que des répertoires).
Une autre solution pour ce problème (spécifiquement) ?
 
(note : le début n'est pas de moi, j'ai piqué ça dans un post)
 
Autre question : comment virer TOUT l'affichae généré par xcopy ? Même avec l'argument /q il m'affiche le nombre de fichiés copiés.

Message cité 1 fois
Message édité par Dagnan le 02-05-2006 à 00:02:30
Reply

Marsh Posté le 02-05-2006 à 00:06:30    

Dagnan a écrit :

Euh, pour faire quoi, j'ai pas compris :(.


Bah, toi tu isoles les fichiers dont le nom suit un certain pattern afin de les traiter, donc pourquoi ne pas lancer le programme directement avec uniquement ces fichiers en argument, évitant ainsi les aller/retour de copier/coller ?

Reply

Marsh Posté le 02-05-2006 à 00:09:09    

Parce que sinon le mogrify me modifie directement les images entrées, c'est pour ça que j'en créé une copie d'abord.

Reply

Marsh Posté le 02-05-2006 à 00:21:41    

Bon voilà ça marche comme je le veux, plus ou moins :
 

Code :
  1. @echo off
  2. @dir /a:d /b .\ > liste-rep.txt
  3. @for /f "delims=" %%a in ('type liste-rep.txt') do call :commande "%%a"
  4. @del liste-rep.txt
  5. :commande
  6. @set variable=%~1
  7. if "%variable%" == "red" goto fin
  8. @xcopy /q /y ".\%variable%\*.jpg" ".\%variable%\red\"
  9. @cd ".\%variable%\red\"
  10. @mogrify -format jpg -gravity Center -crop 80%%x0+0 "*.jpg"
  11. @mogrify -format jpg -thumbnail 120x90! -quality 80 -antialias "*.jpg"
  12. @cd ..\..\
  13. @xcopy /q /y ".\%variable%\red\*.jpg" ".\red\"
  14. @rd /q /s ".\%variable%\red\"
  15. @set variable=
  16. :fin


 
Mais c'est assez bourrain, et surtout ça traite tous les fichiers.
Je vais essayer de faire une autre version en traitant chaque fichier séparément de manière à vérifier si la vignette n'existe pas déjà.

Reply

Marsh Posté le 02-05-2006 à 00:22:11    

Et en quoi ce serait un souci ? Parce que là tu déplaces les fichiers pour les modifier, puis les fais revenir dans le dossier initial en écrasant les originaux. Ou j'ai mal compris ?
 
Sinon, pour virer les commentaires, tu les rediriges vers nul :
commande > nul 2>&1

Reply

Marsh Posté le 02-05-2006 à 00:26:50    

Non je les remet ensuite dans le rep \red du dossier parent.
Si tu veux j'ai un répertoire parent, avec un sous-rep red, et le répertoire parent contient des sous-rep qui contiennent des sous-sous-rep red.

Reply

Marsh Posté le 02-05-2006 à 00:34:47    

Dans ce cas, pourquoi ne pas utiliser l'option  
-write red\fichier_sortie  
?

Reply

Marsh Posté le 02-05-2006 à 00:42:55    

Parce que j'utilise mogrify, et pas convert. Il me semble pas que ce soit possible.

Reply

Marsh Posté le 02-05-2006 à 00:42:55   

Reply

Marsh Posté le 02-05-2006 à 00:44:27    

Reply

Marsh Posté le 02-05-2006 à 00:49:13    

D'accord, mais comment faire en sorte d'écrire dans un fichier qui conserve le même nom, avec le préfixe th- par exemple ?
 
edit : nan il aime pas -write avec un rep et un fichier


Message édité par Dagnan le 02-05-2006 à 00:52:49
Reply

Marsh Posté le 02-05-2006 à 00:54:44    

On ne peut travailler que dans un répertoire, pas moyen d'enregistrer dans un répertoire parent, que ce soit convert ou mogrify, je viens de tester.

Reply

Marsh Posté le 02-05-2006 à 01:09:53    

-write red/fichier_sortie
 
à la Unix/Linux ne marche pas non plus ?

Reply

Marsh Posté le 02-05-2006 à 01:17:23    

Nop :(
 
Bon de toutes façons je refais tout.
 
Voilà le code :D
 

Code :
  1. @echo off
  2. @dir /a:d /b .\ > liste-rep.txt
  3. @for /f "delims=" %%a in ('type liste-rep.txt') do call :commande "%%a"
  4. @del liste-rep.txt
  5. :commande
  6. @set variable=%~1
  7. if "%variable%" == "red" goto fin
  8. if "%variable%" == "" goto fin
  9. @cd %variable%
  10. @dir /b *.jpg > liste-fic.txt
  11. @for /f "delims=" %%a in ('type liste-fic.txt') do call :fichier "%%a"
  12. @del liste-fic.txt
  13. @cd ..
  14. @set variable=
  15. :fichier
  16. @set fich=%~1
  17. if NOT "%fich%" == "" (
  18. @echo %~1
  19. rem @convert %fich% -gravity Center -crop 80%%x0+0 th-%fich%
  20. rem @convert th-%fich% -thumbnail 120x90! -quality 80 -antialias th-%fich%
  21. rem @move th-%fich% "..\red\%fich%"
  22. )
  23. @set fich=
  24. :fin


 
Ca marche presque, sauf que pour une raison inconnue, dans :fichier, %~1 appelle bien sûr le nom de chaque fichier, mais aussi celui des répertoires. Je ne comprend pas pourquoi.
Parce que quand je fais :

Code :
  1. @for /f "delims=" %%a in ('type liste-fic.txt') do echo "%%a"


j'ai bien juste le nom des fichiers qui s'affiche (ce que je veux).
 
:(

Reply

Marsh Posté le 02-05-2006 à 01:20:35    

Mouais. Ben grâce à mon habile tour de passe-passe, ça fonctionne plutôt bien :
 

Code :
  1. @echo off
  2. @dir /a:d /b .\ > liste-rep.txt
  3. @for /f "delims=" %%a in ('type liste-rep.txt') do call :commande "%%a"
  4. @del liste-rep.txt
  5. :commande
  6. @set variable=%~1
  7. if "%variable%" == "red" goto fin
  8. if "%variable%" == "" goto fin
  9. @cd %variable%
  10. @dir /b *.jpg > liste-fic.txt
  11. @for /f "delims=" %%a in ('type liste-fic.txt') do (
  12. @convert %%a -gravity Center -crop 80%%x0+0 th-%%a
  13. @convert th-%%a -thumbnail 120x90! -quality 80 -antialias th-%%a
  14. @move th-%%a "..\red\%%a"
  15. )
  16. @del liste-fic.txt
  17. @cd ..
  18. @set variable=
  19. :fin


 
Me reste à faire la vérif pour le cas où le fichier existe déjà et voilà ^^.


Message édité par Dagnan le 02-05-2006 à 01:21:35
Reply

Marsh Posté le 02-05-2006 à 01:40:49    

Je suppose que tu laisses les @ à tout bout de champ uniquement pour le debug et tu les vires après ?
 
Sinon, pour la première phase :

Code :
  1. @dir /a:d /b . > liste-rep.txt
  2. @for /f "delims=" %%a in ('type liste-rep.txt') do call :commande "%%a"
  3. @del liste-rep.txt


-->

Code :
  1. for /f %%a in ('dir /a:d /b') do call :commande %%a


 
Pour la récupération des noms de jpg dans la deuxième phase :

Code :
  1. for %%a in (*.jpg) do (..)

Reply

Marsh Posté le 02-05-2006 à 01:44:09    

T'es sûr pour l'avant dernier truc ? parce que ça semble pas fonctionner des masses.
Et pour le @, c'est pas fait pour empecher la sortie par défaut ?


Message édité par Dagnan le 02-05-2006 à 01:44:43
Reply

Marsh Posté le 02-05-2006 à 01:47:06    

Ah ok. Mais comment je fais pour gérer les espaces dans le nom, avec %%a ?
 
Si je créé une variable de la valeur de %%a ça m'affiche rien.
 
-> trouvé, c'était le "delims=" (là c'était au pif que j'ai testé ^^)


Message édité par Dagnan le 02-05-2006 à 01:49:51
Reply

Marsh Posté le 02-05-2006 à 01:54:25    

@echo off désactive l'affichage des commandes à exécuter. Ca n'a rien à voir avec la sortie.
 
echo on/off affecte toutes les commandes qui suivent. @ au début une ligne n'affecte que la ligne en question.
 
Pour les espaces dans %%a, il suffit de le quoter :
call :commande "%%a"
 
Sinon, c'est moche de faire un
set variable=
à la fin ;)
 
Utilise plutôt
setlocal
au début du script et
endlocal
à la fin.
 
Bon, assez pour aujourd'hui. On continue si nécessaire demain.
 
Bonne nuit :sleep:

Reply

Marsh Posté le 02-05-2006 à 01:58:59    

Ok, bah merci. Je vais continuer un peu et je go dodo.
Je vais faire la gueule demain matin en maths à 8h xD

Reply

Marsh Posté le 02-05-2006 à 02:23:09    

Voilà c'est mieux avec ça :
 

Code :
  1. @echo off
  2. echo - >> log.txt
  3. date /t >> log.txt
  4. time /t >> log.txt
  5. for /f "delims=" %%a in ('dir /a:d /b') do (
  6. if NOT "%%a" == "red" (
  7. if NOT "%%a" == "" (
  8. cd %%a
  9. for /f "delims=" %%b in ('dir /b *.jpg') do (
  10.  if NOT EXIST "..\red\%%b" (
  11.   convert "%%b" -gravity Center -crop 80%%x0+0 "th-%%b"
  12.   convert "th-%%b" -thumbnail 120x90! -quality 80 -antialias "th-%%b"
  13.   move "th-%%b" "..\red\%%b"
  14.   echo Fichier %%b OK >> ..\log.txt
  15.   echo "Fichier %%b -> OK"
  16.   rem Comment afficher tout sans les " - a cause du > ?
  17.  )
  18.  if EXIST "..\red\%%b" (
  19.   echo Existe %%b >> ..\log.txt
  20.   echo Existe %%b
  21.  )
  22. )
  23. cd ..
  24. )
  25. )
  26. )


 
Mais il me reste quelques questions :
 
Si je veux écrire la date et l'heure sur la même ligne, je fais comment ? (obligé de passer par des variables ?)
Pareil pour le saut de ligne :/ (j'ai tenté un pauvre \n en vain) -> trouvé : echo.
 
Note : Ca ne fonctionne pas :

Code :
  1. for /f %%b in (*.jpg)


(j'ai testé avec des quotes, etc., en vain aussi...)
 
Pour ma question dans le code : comment afficher un caractère spécial avec echo sans avoir à mettre de double-quotes ?
 
Comment combiner les deux if du milieu (du genre if ( cond1 AND cond2)) ?
 
Voilà ça fait pas mal de questions je sais, mais merci encore :)

Message cité 1 fois
Message édité par Dagnan le 02-05-2006 à 03:00:38
Reply

Marsh Posté le 02-05-2006 à 06:43:58    

Dagnan a écrit :

Si je veux écrire la date et l'heure sur la même ligne, je fais comment ? (obligé de passer par des variables ?)


Oui. Sauf que les variables existent déjà.

Code :
  1. echo %DATE% %TIME%>>log.txt


Dagnan a écrit :

Note : Ca ne fonctionne pas :

Code :
  1. for /f %%b in (*.jpg)



Le /f est de trop (cf. mon code d'hier).

Dagnan a écrit :

comment afficher un caractère spécial avec echo sans avoir à mettre de double-quotes ?


Code :
  1. echo Fichier %%b -^> OK


Dagnan a écrit :

Comment combiner les deux if du milieu (du genre if ( cond1 AND cond2)) ?


La seule méthode possible :

Code :
  1. if cond1 (
  2.   if cond2 (
  3.     ...
  4.   )
  5. )


par contre, tu as if ... else... pour ton if exist ... if not exist  

Code :
  1. if ... (
  2.   ...
  3. ) else (
  4.   ...
  5. )


Dagnan a écrit :

Voilà ça fait pas mal de questions je sais, mais merci encore :)


Voilà et bonne journée ;)

Reply

Marsh Posté le 02-05-2006 à 06:59:48    

Yay merci, bonne journée à toi aussi :)

Reply

Marsh Posté le 02-05-2006 à 09:24:29    

Tiens, encore une question stp. Comment isoler/obtenir la taille d'un fichier ?
 
J'ai trouvé ça :

Code :
  1. for /f %%a in ('dir "%nom%" /s /b /-c /a:-d-s-h') do echo %%~za octets


 
Mais ça ne semble pas marcher super :/
 
edit : ah si, enfin presque, j'ai pu d'erreur mais ça affiche pas grand chose :s


Message édité par Dagnan le 02-05-2006 à 09:49:28
Reply

Marsh Posté le 02-05-2006 à 12:21:55    

Laisse tomber le dir pour les fichiers (cf. plus haut) !

Code :
  1. for %%a in ("%nom%" ) do (
  2.   echo %%~za
  3. )

Reply

Marsh Posté le 02-05-2006 à 13:09:48    

J'ai un for qui ressemble à ça :
 

Code :
  1. set compression=1
  2. for %%c in ("th-%~1" ) do (
  3.  if "%%~zc" GTR "4000" (
  4.   rem set /a compression+=5
  5.   set compression=12
  6.   echo %compression%
  7.  )
  8.  rem set taille=%%~zc
  9.  echo Fichier %~1 ^(%%~zc^) -^> OK >> ..\log.txt
  10.  echo Fichier %~1 ^(%%~zc^) -^> OK
  11.  rem echo Fichier %~1 ^(%taille%^) -^> OK |> Ne fonctionne pas
  12. )


 
Je n'arrive pas à allouer une nouvelle valeur à compression, j'ai toujours la première :(
 
A chaque fois que je relance le script, le echo m'affiche la valeur précédent de %compression%, je n'y comprend rien.
 
edit : avec @set au lieu de set ça fonctionne nickel. Une petite explication SVP ?
 
edit2 :
 

Code :
  1. @set /a compression=101
  2. for %%c in ("th-%~1" ) do (
  3. if "%%~zc" GTR "4000" (
  4.  rem set /a compression+=5
  5.  @set /a compression2=compression+79
  6.  echo %compression2%
  7. )
  8. )


 
Là ça fonctionne presque, mais ça se met à jour qu'au lancement d'après, et j'ai deux variables, pas très pratique.
Je comprend pas du tout comment ça fonctionne cette histoire.
 
edit 3 : Euh, bon j'ai mes deux /set /a sans @ et ça semble fonctionne, je viens de comprendre un truc : je suis bête xD

Message cité 1 fois
Message édité par Dagnan le 02-05-2006 à 13:25:27
Reply

Marsh Posté le 02-05-2006 à 13:24:39    

Pour la comparaison des valeurs numériques, enlève les guillemets, sinon tu vas avoir des surprises.
 
Pour l'affectation des valeurs aux variables à l'intérieur d'une boucle ou d'un if, refère à l'aide de set, paragraphe expansion retardée des variables d'environnement. Le plus simple serait d'appeler une procédure de traitement.

Reply

Marsh Posté le 02-05-2006 à 13:27:06    

Dagnan a écrit :


Code :
  1. @set /a compression=101
  2. ...


 
Là ça fonctionne presque, mais ça se met à jour qu'au lancement d'après, et j'ai deux variables, pas très pratique.
Je comprend pas du tout comment ça fonctionne cette histoire.


Tu exécutes le script depuis un shell ? C'est simple, la variable existe toujours après la sortie du batch !
 
Utilise setlocal/endlocal j'avais dit.

Reply

Marsh Posté le 02-05-2006 à 18:06:18    

Voilà le code actuel :
 

Code :
  1. @echo off
  2. echo. >> log.txt
  3. echo %DATE% %TIME% >> log.txt
  4. for /f "delims=" %%a in ('dir /a:d /b') do (
  5. if NOT "%%a" == "red" (
  6. if NOT "%%a" == "" (
  7. cd %%a
  8. for %%b in (*.jpg) do call :manipulation "%%b" 90
  9. cd ..
  10. )
  11. )
  12. )
  13. :manipulation
  14. if NOT "%~1" == "" (.
  15. if NOT EXIST "..\red\%~1" (
  16. set /a compression=%2
  17. echo Compression : %compression%
  18. convert "%~1" -gravity Center -crop 80%%x0+0 "th-%~1"
  19. convert "th-%~1" -resize 120x90! -quality %compression% "th-%~1"
  20. for %%c in ("th-%~1" ) do (
  21.  if %%~zc GTR 4000 (
  22.   set /a compression-=5
  23.   del /f "th-%~1"
  24.   call :manipulation "%~1" %compression%
  25.  ) else (
  26.  rem set taille=%%~zc
  27.  echo Fichier %~1 ^(%%~zc^) -^> OK >> ..\log.txt
  28.  echo Fichier %~1 ^(%%~zc^) -^> OK
  29.  set /a compression=90
  30.  move "th-%~1" "..\red\%~1"
  31.  )
  32. )
  33. ) ELSE (
  34. echo Existe %~1 >> ..\log.txt
  35. )
  36. )
  37. :fin


 
Et la sortie

Code :
  1. >tout.bat
  2. Compression : 90
  3. Compression : 85
  4. Fichier SnS21.jpg (3763) -> OK
  5. Compression : 90
  6. Compression : 85
  7. Fichier SnS22.jpg (3591) -> OK
  8. Compression : 90
  9. Compression : 85
  10. Compression : 85
  11. Compression : 80
  12. Fichier SnS23.jpg (3499) -> OK
  13. Compression : 90
  14. Compression : 85
  15. Fichier SnS24.jpg (3689) -> OK


 
Ca fonctionne.
Mais il teste deux fois 85 O_o
-> j'ai fait un test avec une décrémentation de 1 et en fait chaque valeur reste deux "tours" :/
J'ai lu le truc de set avec l'extension machin, mais faut utiliser cmd.exe /v. Si j'exécute un fichier batch comment je peux l'activer ?
Ca semble résoudre le problème du doublon, mais je n'ai plus accès à %compression%.
D'autres part j'ai rien compris pour le setlocal ^^
 
edit :
ça semble fonctionne comme je le veux maintenant :
 

Code :
  1. @echo off
  2. echo. >> log.txt
  3. echo %DATE% %TIME% >> log.txt
  4. for /f "delims=" %%a in ('dir /a:d /b') do (
  5. if NOT "%%a" == "red" (
  6. if NOT "%%a" == "" (
  7. cd %%a
  8. for %%b in (*.jpg) do call :manipulation "%%b" 90
  9. cd ..
  10. )
  11. )
  12. )
  13. :manipulation
  14. if NOT "%~1" == "" (
  15. if NOT EXIST "..\red\%~1" (
  16. set /a compression=%2
  17. echo Compression : %compression%
  18. convert "%~1" -gravity Center -crop 80%%x0+0 "th-%~1"
  19. convert "th-%~1" -resize 120x90! -quality %compression% "th-%~1"
  20. for %%c in ("th-%~1" ) do (
  21.  if %%~zc GTR 4000 (
  22.   set /a compression-=1
  23.   del /f "th-%~1"
  24.   call :manipulation "%~1" !compression!
  25.  ) else (
  26.   echo Fichier %~1 ^(%%~zc^) -^> OK >> ..\log.txt
  27.   echo Fichier %~1 ^(%%~zc^) -^> OK
  28.   set /a compression=90
  29.   move "th-%~1" "..\red\%~1"
  30.  )
  31. )
  32. ) ELSE (
  33. echo Existe %~1 >> ..\log.txt
  34. )
  35. )
  36. :fin


 
Sauf que si on lance le fichier batch tout seul, ça ne fonctionne pas :(
Autre problème : lorsque on lance le script pour la première fois, la variable compression ne semble pas initialisée. Pourtant il y a bien un set mais rien n'y fait. problème avec setlocal peut-être ?


Message édité par Dagnan le 02-05-2006 à 18:51:38
Reply

Marsh Posté le 02-05-2006 à 19:05:07    

Voili voilou, ça fonctionn vraiment cette fois-ci.
Reste à régler le problème du cmd /v. Sinon les deux var au début je sais pas si c'est très beau mais ça fonctionne :D
C'est réglé ^^
 

Code :
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. rem gérer une archive. On met le contenu de red dans un dossier archive et on supprime l'ancien dossier archive
  4. echo. >> log.txt
  5. echo %DATE% %TIME% >> log.txt
  6. set /a compression=90
  7. set /a origine=%compression%
  8. for /f "delims=" %%a in ('dir /a:d /b') do (
  9. if NOT "%%a" == "red" (
  10. if NOT "%%a" == "" (
  11. cd %%a
  12. for %%b in (*.jpg) do call :manipulation "%%b" %compression%
  13. cd ..
  14. )
  15. )
  16. )
  17. :manipulation
  18. if NOT "%~1" == "" (
  19. rem Sinon il traite le cas où c'est vide...
  20. if NOT EXIST "..\red\%~1" (
  21. rem echo Fichier : %~1
  22. rem echo Compression : %compression%
  23. convert "%~1" -gravity Center -crop 80%%x0+0 "th-%~1"
  24. convert "th-%~1" -resize 120x90! -quality %compression% "th-%~1"
  25. for %%c in ("th-%~1" ) do (
  26.  if %%~zc GTR 4000 (
  27.   set /a compression-=1
  28.   del /f "th-%~1"
  29.   call :manipulation "%~1" !compression!
  30.  ) else (
  31.   echo Fichier %~1 ^(%%~zc !compression!%%^) -^> OK >> ..\log.txt
  32.   echo Fichier %~1 ^(%%~zc !compression!%%^) -^> OK
  33.   set /a compression=%origine%
  34.   move "th-%~1" "..\red\%~1"
  35.  )
  36. )
  37. ) ELSE (
  38. echo Existe %~1 >> ..\log.txt
  39. echo Existe %~1
  40. )
  41. )
  42. :fin


 
Plus qu'un petit système pour archiver de temps en temps, et rafraichir le log, et c'est bon ^_^


Message édité par Dagnan le 02-05-2006 à 19:11:26
Reply

Marsh Posté le 11-05-2006 à 13:39:53    

Voilà la dernière (ou presque) version du script, qui génère un dossier d'archive où il met les images présentes dans \red.
Le script créé aussi tout seul \red s'il n'existe pas.
 

Code :
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. rem Ecriture du log
  4. echo. >> log.txt
  5. echo %DATE% %TIME% >> log.txt
  6. rem Definitions
  7. set /a compression=90
  8. set /a origine=%compression%
  9. set /a existe=0
  10. rem Pour recuperer la date
  11. for /f "tokens=1-4 delims=/ " %%i in ('date /t') do (set today=%%i-%%j-%%k)
  12. rem Creation de \red, du repertoire d'archive et deplacement des fichiers
  13. if NOT EXIST "red\" (
  14. mkdir .\red
  15. ) else (
  16. if NOT EXIST ".\red\archive-%today%" (
  17.  mkdir .\red\archive-%today%
  18.  for %%b in (.\red\*.jpg) do move "%%b" ".\red\archive-%today%\"
  19.  echo Deplacement des fichiers dans archive-%today%
  20.  echo Deplacement des fichiers dans archive-%today% >> log.txt
  21. )
  22. )
  23. rem Pour chaque sous repertoire et chaque fichier a l'interieur execute :manipulation
  24. for /f "delims=" %%a in ('dir /a:d /b') do (
  25. if NOT "%%a" == "red" (
  26. if NOT "%%a" == "" (
  27. cd %%a
  28. for %%b in (*.jpg) do call :manipulation "%%b" %compression%
  29. cd ..
  30. )
  31. )
  32. )
  33. :manipulation
  34. if NOT "%~1" == "" (
  35. rem (sinon il traite le cas où c'est vide...)
  36. rem On regarde si le fichier existe dans \red
  37. if EXIST "..\red\%~1" (
  38.  set /a existe=1
  39.  echo Existe %~1 >> ..\log.txt
  40.  echo Existe %~1
  41. ) else (
  42.  rem Sinon on regarde s'il est dans l'un des repertoires d'archive
  43.  for /f "delims=" %%i in ('dir /d /b ..\red\archive-*') do (
  44.   if EXIST "..\red\%%i\%~1" (
  45.    set /a existe=1
  46.    echo Existe %~1 >> ..\log.txt
  47.    echo Existe %~1
  48.   )
  49.  )
  50. )
  51. rem Si le fichier n'existe pas (sinon existe vaut 1)
  52. if "!existe!" == "0" (
  53.  rem Commandes ImageMagick
  54.  convert "%~1" -gravity Center -crop 80%%x0+0 "th-%~1"
  55.  convert "th-%~1" -resize 120x90! -quality %compression% "th-%~1"
  56.  rem Boucle sur un fichier, pour obtenir sa taille
  57.  for %%c in ("th-%~1" ) do (
  58.   rem Teste sur la taille (> 4000) -> si oui on refait la manip avec une compression inferieure
  59.   if %%~zc GTR 4000 (
  60.    set /a compression-=1
  61.    del /f "th-%~1"
  62.    call :manipulation "%~1" !compression!
  63.   ) else (
  64.    echo Fichier %~1 ^(%%~zc !compression!%%^) -^> OK >> ..\log.txt
  65.    echo Fichier %~1 ^(%%~zc !compression!%%^) -^> OK
  66.    set /a compression=%origine%
  67.    move "th-%~1" "..\red\%~1"
  68.   )
  69.  )
  70. )
  71. rem On remet existe a 0 !
  72. set /a existe=0
  73. )
  74. :fin


Message édité par Dagnan le 11-05-2006 à 14:54:29
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed