Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1192 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [batch] Amélioration de script

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[batch] Amélioration de script

n°1357450
Dagnan
Posté le 01-05-2006 à 22:55:41  profilanswer
 

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
mood
Publicité
Posté le 01-05-2006 à 22:55:41  profilanswer
 

n°1357467
wackevat
Posté le 01-05-2006 à 23:53:00  profilanswer
 

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

n°1357476
Dagnan
Posté le 02-05-2006 à 00:01:09  profilanswer
 

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
n°1357480
wackevat
Posté le 02-05-2006 à 00:06:30  profilanswer
 

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 ?

n°1357482
Dagnan
Posté le 02-05-2006 à 00:09:09  profilanswer
 

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

n°1357486
Dagnan
Posté le 02-05-2006 à 00:21:41  profilanswer
 

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à.

n°1357487
wackevat
Posté le 02-05-2006 à 00:22:11  profilanswer
 

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

n°1357489
Dagnan
Posté le 02-05-2006 à 00:26:50  profilanswer
 

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.

n°1357490
wackevat
Posté le 02-05-2006 à 00:34:47  profilanswer
 

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

n°1357492
Dagnan
Posté le 02-05-2006 à 00:42:55  profilanswer
 

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

mood
Publicité
Posté le 02-05-2006 à 00:42:55  profilanswer
 

n°1357493
wackevat
Posté le 02-05-2006 à 00:44:27  profilanswer
 
n°1357494
Dagnan
Posté le 02-05-2006 à 00:49:13  profilanswer
 

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
n°1357497
Dagnan
Posté le 02-05-2006 à 00:54:44  profilanswer
 

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.

n°1357499
wackevat
Posté le 02-05-2006 à 01:09:53  profilanswer
 

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

n°1357501
Dagnan
Posté le 02-05-2006 à 01:17:23  profilanswer
 

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).
 
:(

n°1357504
Dagnan
Posté le 02-05-2006 à 01:20:35  profilanswer
 

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
n°1357509
wackevat
Posté le 02-05-2006 à 01:40:49  profilanswer
 

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 (..)

n°1357510
Dagnan
Posté le 02-05-2006 à 01:44:09  profilanswer
 

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
n°1357511
Dagnan
Posté le 02-05-2006 à 01:47:06  profilanswer
 

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
n°1357513
wackevat
Posté le 02-05-2006 à 01:54:25  profilanswer
 

@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:

n°1357514
Dagnan
Posté le 02-05-2006 à 01:58:59  profilanswer
 

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

n°1357515
Dagnan
Posté le 02-05-2006 à 02:23:09  profilanswer
 

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
n°1357526
wackevat
Posté le 02-05-2006 à 06:43:58  profilanswer
 

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 ;)

n°1357527
Dagnan
Posté le 02-05-2006 à 06:59:48  profilanswer
 

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

n°1357554
Dagnan
Posté le 02-05-2006 à 09:24:29  profilanswer
 

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
n°1357704
wackevat
Posté le 02-05-2006 à 12:21:55  profilanswer
 

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

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

n°1357731
Dagnan
Posté le 02-05-2006 à 13:09:48  profilanswer
 

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
n°1357737
wackevat
Posté le 02-05-2006 à 13:24:39  profilanswer
 

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.

n°1357739
wackevat
Posté le 02-05-2006 à 13:27:06  profilanswer
 

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.

n°1357999
Dagnan
Posté le 02-05-2006 à 18:06:18  profilanswer
 

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
n°1358030
Dagnan
Posté le 02-05-2006 à 19:05:07  profilanswer
 

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
n°1364186
Dagnan
Posté le 11-05-2006 à 13:39:53  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [batch] Amélioration de script

 

Sujets relatifs
batch sous repertoire dans IF EXISTscript php et compatibilité des navigateurs
Changer La lettre du disque dur externe, avec un *.bat ou un script ?[VBS] Organiser la sortie d'un script dans un tableau excel
Amélioration de la structure des tables - problème d'évolutionBATCH help
biblothèque de script php pour bricoleurpendu en Action Script
Script equivalent a dl.free.frProblème d'encoding : erreur de script IE
Plus de sujets relatifs à : [batch] Amélioration de script


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR