Amélioration de script [batch] - Shell/Batch - Programmation
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 :
|
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.
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 ?
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.
Marsh Posté le 02-05-2006 à 00:21:41
Bon voilà ça marche comme je le veux, plus ou moins :
Code :
|
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à.
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
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.
Marsh Posté le 02-05-2006 à 00:34:47
Dans ce cas, pourquoi ne pas utiliser l'option
-write red\fichier_sortie
?
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.
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
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.
Marsh Posté le 02-05-2006 à 01:09:53
-write red/fichier_sortie
à la Unix/Linux ne marche pas non plus ?
Marsh Posté le 02-05-2006 à 01:17:23
Nop
Bon de toutes façons je refais tout.
Voilà le code
Code :
|
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 :
|
j'ai bien juste le nom des fichiers qui s'affiche (ce que je veux).
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 :
|
Me reste à faire la vérif pour le cas où le fichier existe déjà et voilà ^^.
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 :
|
-->
Code :
|
Pour la récupération des noms de jpg dans la deuxième phase :
Code :
|
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 ?
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é ^^)
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
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
Marsh Posté le 02-05-2006 à 02:23:09
Voilà c'est mieux avec ça :
Code :
|
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 :
|
(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
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 :
|
Dagnan a écrit : Note : Ca ne fonctionne pas :
|
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 :
|
Dagnan a écrit : Comment combiner les deux if du milieu (du genre if ( cond1 AND cond2)) ? |
La seule méthode possible :
Code :
|
par contre, tu as if ... else... pour ton if exist ... if not exist
Code :
|
Dagnan a écrit : Voilà ça fait pas mal de questions je sais, mais merci encore |
Voilà et bonne journée
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 :
|
Mais ça ne semble pas marcher super
edit : ah si, enfin presque, j'ai pu d'erreur mais ça affiche pas grand chose :s
Marsh Posté le 02-05-2006 à 12:21:55
Laisse tomber le dir pour les fichiers (cf. plus haut) !
Code :
|
Marsh Posté le 02-05-2006 à 13:09:48
J'ai un for qui ressemble à ça :
Code :
|
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 :
|
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
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.
Marsh Posté le 02-05-2006 à 13:27:06
Dagnan a écrit :
|
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.
Marsh Posté le 02-05-2006 à 18:06:18
Voilà le code actuel :
Code :
|
Et la sortie
Code :
|
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 :
|
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 ?
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
C'est réglé ^^
Code :
|
Plus qu'un petit système pour archiver de temps en temps, et rafraichir le log, et c'est bon ^_^
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 :
|
Marsh Posté le 01-05-2006 à 22:55:41
Bonsoir.
J'ai passé l'après midi à pondre le code suivant :
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