[batch] Problèmes et questions
Forum Programmation : [batch] Problèmes et questions
Bonjour,
Je mettrai mes différents problèmes et éventuelles questions dans ce sujet.
Je rencontre régulièrement un problème assez gênant et dont je ne comprends pas l'origine. Il s'agit encore des extensions de variables avec FOR.
Exemples :
| Citation : del %temp%\test*.txt
|
Seul %%~nA et %%~xA sont pris en compte... impossible d'obtenir la date et la taille des fichiers. Je n'arrive pas à comprendre pourquoi... Si quelqu'un pouvait m'expliquer ça serait sympa.
Merci d'avance.
edit: J'aurais aussi une autre question > Pourquoi lorsque je mets %%~fA, il me sort le chemin d'accès du répertoire en cours devant tous mes fichiers au lieu de mettre le chemin d'accès du fichier en question ? Encore un truc que j'ai du mal à saisir.
Message édité par Egwene le 01-02-2009 à 17:48:03
Sécurité / Prévention
Parce qu'avec tasklist, tu as le nom de l'exe, mais tu ne te trouve pas dans le répertoire où se trouve l'exe. Il faut bien savoir où il est pour lire sa taille.
si tu te place dans windows/system32, tu devrais voir certaines dates. Le batch est très vite limité pour ce que tu fais, mieux vaut faire ça en C win32API, tu as accès à toutes les infos.
pour le %%~fA, je pense que c'est le même problème que précédemment.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| Citation : Le batch est très vite limité pour ce que tu fais, mieux vaut faire ça en C win32API, tu as accès à toutes les infos. |
Merci CRicky pour ta réponse, je comprends mieux mes multiples problèmes à ce niveau.
Le problème étant que je débute en programmation, je fais ça en loisir, et je m'étais dit que quitte à commencer, autant commencer par le langage le plus simple.
Une idée me vient : peut-être qu'en modifiant la variable %path% je pourrais lui demander de se placer respectivement dans l'ensemble des dossiers respectivement ?
Sinon, j'ai vu qu'il y avait plein de kits pour le batch... je pense que je devrais en trouver qui pallieraient ce problème.
En tous cas merci de tes explications, au moins maintenant je sais pourquoi ça ne marche pas.
J'aurais une autre question si ça ne te dérange pas :
Mettons que j'ai trois fichiers textes, chacun contenant une liste de noms. Je voudrais pouvoir mettre bout à bout les premières lignes de chacun des trois fichiers, idem pour les deuxièmes, troisièmes etc. Mais avec plusieurs boucles FOR, ça met bout à bout tous les mots de la première ligne du premier fichier avec tous ceux du second fichiers, eux-mêmes avec tous ceux du troisième... autant dire que ça combine tout alors que je ne voulais que combiner les lignes portant le même numéro. J'espère que j'ai été clair.
Merci pour tes réponses en tous cas.
Et quitte à débuter alors, tu conseillerais quel langage ?
Merci !
Sécurité / Prévention
Répondre à Egwene
J'ai testé avec la variable %path%
| Citation : del %temp%\test*.txt
|
Le résultat est de loin meilleur, sachant que je peux après remettre en forme comme je le souhaite avec une autre boucle FOR. Mais j'y vois deux inconvénients majeurs :
1- Augmenter les chemins dans %PATH%, et cela est quasi impossible de tous les avoir, il y en aura toujours qui passeront à la trape.
2- Rallonge la durée du scan.
Tu penses qu'il y aurait d'autres solutions plus efficaces et moins longues ?
Je vais voir avec les kits, s'il n'y en a pas un qui facilite ce genre de choses.
Tiens-moi au courant, merci !
Sécurité / Prévention
Répondre à Egwene
| Citation : Le problème étant que je débute en programmation, je fais ça en loisir, et je m'étais dit que quitte à commencer, autant commencer par le langage le plus simple.
|
Le python est beaucoup plus simple et beaucoup plus puissant.
| Citation : Une idée me vient : peut-être qu'en modifiant la variable %path% je pourrais lui demander de se placer respectivement dans l'ensemble des dossiers respectivement ? |
Tu peux scanner le PATH pour avoir les processus systèmes, mais pour les processus utilisateur, lancé hors du path, je doute que tu le retrouves.
| Citation : Mettons que j'ai trois fichiers textes, chacun contenant une liste de noms. Je voudrais pouvoir mettre bout à bout les premières lignes de chacun des trois fichiers, idem pour les deuxièmes, troisièmes etc. Mais avec plusieurs boucles FOR, ça met bout à bout tous les mots de la première ligne du premier fichier avec tous ceux du second fichiers, eux-mêmes avec tous ceux du troisième... autant dire que ça combine tout alors que je ne voulais que combiner les lignes portant le même numéro. J'espère que j'ai été clair. |
Tu peux toujours imbriquer des for comme tu le penses, et avoir un compteur pour éviter toutes les combinaisons (solution mauvaise puisque ça fait perdre beaucoup temps). En python c'est beaucoup plus simple
| Citation : Et quitte à débuter alors, tu conseillerais quel langage ? |
Je te laisse deviner
Pour le PATH, tu peux le mémoriser dans une variable avant de le toucher pour le remettre comme avant à la fin.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Bonsoir CRicky,
| Citation : Tu peux toujours imbriquer des for comme tu le penses, et avoir un compteur pour éviter toutes les combinaisons (solution mauvaise puisque ça fait perdre beaucoup temps). En python c'est beaucoup plus simple |
Merci de ta réponse
J'ai avancé un peu, mais je n'y ai pas trop touché, ma dernière version du code pour les processus est la suivante :
| Citation : del %temp%\test*.txt
|
| Citation : Tu peux scanner le PATH pour avoir les processus systèmes, mais pour les processus utilisateur, lancé hors du path, je doute que tu le retrouves. |
En effet
| Citation : Tu peux toujours imbriquer des for comme tu le penses, et avoir un compteur pour éviter toutes les combinaisons (solution mauvaise puisque ça fait perdre beaucoup temps). En python c'est beaucoup plus simple |
Tu pourrais me donner un exemple simple ? Car j'ai un peu du mal à visualiser la façon dont cela est réalisable. Content que ce soit possible, même si c'est long
En parlant de longueur, je sais ce que sais : j'ai un code pour lister les fichiers de moins de 30jours, ou de moins de 60jours ou de moins de 90jours ( choix utilisateur ). Le code est très long, alors que j'ai vu que certaines commandes externes le faisaient en 3 lignes
Enfin, l'essentiel, à mes yeux, est de pratiquer, puisque pour le moment mon souci n'est pas de créer un truc précis, mais bien de m'initier.
Je suis très intéressé par l'histoire du compteur, ça va m'être utile
| Citation : Le python est beaucoup plus simple et beaucoup plus puissant. |
Oki
Je prends note du conseil, sinon j'avais pensé à C++, tant qu'à faire autant y aller franchement.
Mais pour le moment je vais continuer en batch, ça permet d'acquérir certaines bases.
La programmation m'intéresse principalement dans une optique de "désinfection", donc dans le domaine de la sécurité informatique et de windows donc. Tout ce qui touche aux fichiers, dossiers, services, drivers, etc. Python toujours bien pour ça ou il y en a un autre plus adéquat ?
Merci de prendre le temps de répondre à mes questions.
edit: Si je te pose toutes ces questions sur quel langage choisir, c'est que je compte m'acheter à un deux bouquins sur le langage en question, et comme les bouquins peuvent coûter jusqu'à 70 euros, je ne voudrais pas en acheter un concernant tel langage si finalement je découvre que tel autre est plus conseillé. Comme je pense que tu commences à saisir ce que je compte faire en programmation, et quelles sont mes bases ( environ égales à 0
), je suivrai ton conseil.
Par contre, comme je fais ça en loisir et que je suis étudiant en lettres, je ne peux pas y consacrer trop de temps, mais faut bien commencer un jour, si on veut franchir la ligne d"arrivée
Message édité par Egwene le 02-02-2009 à 22:03:43
Sécurité / Prévention
Répondre à Egwene
| Citation : Tu pourrais me donner un exemple simple ? |
simple, non
Tu peux faire un for sur le premier fichier dans lequel tu incrémentes un compteur (avec expansion retardée en utilisant le ! au lieu du %) et tu fais une autre boucle à l'intérieur de la première sur les lignes du second fichier.
Dans cette seconde boucle, tu incrémentes un autre compteur. Dans cette boucle, tu teste si les 2 compteurs sont égaux. Et dans ce IF, tu concatène les lignes et tu enregistres dans le nouveau fichier.
A l'intérieur des boucles, il faut utiliser l'expansion retardée pour les variables, sinon la variable n'est modifiée que lorsque le for est terminé.
| Citation : Oki |
oui le C ou le C++ sont des langages puissants mais complexes.
| Citation : Mais pour le moment je vais continuer en batch, ça permet d'acquérir certaines bases. |
Pas vraiment parce que côté algorithmique, c'est finalement très limité.
| Citation : La programmation m'intéresse principalement dans une optique de "désinfection", donc dans le domaine de la sécurité informatique et de windows donc. Tout ce qui touche aux fichiers, dossiers, services, drivers, etc. Python toujours bien pour ça ou il y en a un autre plus adéquat ? |
Le problème est que le python est multi-plateforme, donc pas que pour windows.
Ceci dit, en python, on peut utiliser n'importe quelle bibliothèque. On peut utiliser la win32 API et donc on a accès à toutes les fonctions de win32 API utilisable en C. Le module pour ça est pywin32.
Si tu veux te mettre au python, regarde des tutoriaux avant d'acheter un bouquin.
http://python.developpez.com/cours/
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Bonsoir CRicky,
Merci pour toutes ces informations.
| Citation : tu incrémentes un autre compteur. |
C'est bien ça que je n'arrive pas à visualiser...
Sinon, je suis en train d'essayer d'apprendre la syntaxe de SED.EXE, ça m'aidera beaucoup en batch pour ce que je veux faire. Par contre, la syntaxe est hyper balaise
Je pense que je vais rester en batch pour le moment, et je passerai ensuite à C et C++, puisque ce sont les plus poussés.
Je vais aller voir le lien que tu m'as donné, merci
Message édité par Egwene le 03-02-2009 à 22:38:20
Sécurité / Prévention
Répondre à Egwene
C'est encore moi Cricky ![]()
Vu que tu as l'air de bien t'y connaître en programmation, saurais-tu à tout hasard comment remplacer deux guillemets successifs "" par un seul guillemet " avec SED ? Je sais que SED est très utilisé sous Linux, donc il y a de fortes chances que tu connaisses, non ? ![]()
J'ai essayé ce genre de chose, sans succès :
sed -r "s/\"\"/\"/g" fichier.txt>>fichier1.txt
Je réessayerais plus tard... pour l'instant je ne trouve pas.
Merci ![]()
Message édité par Egwene le 04-02-2009 à 17:52:18
Sécurité / Prévention
Répondre à Egwene
A la base sed est une commande unix (fait par des vrais programmeurs
).
La programmation bash sous unix/linux, est beaucoup plus puissante que le batch dos
Je sais que pour le remplacement c'est s/expression regulière/remplacement, mais je n'ai pas vraiment l'habitude de l'utiliser.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Oki, merci Cricky
| Citation : tu incrémentes un autre compteur. |
Et pour le compteur ?
Sécurité / Prévention
Répondre à Egwene
Re,
J'ai réussi à faire un compteur, mais il ne met bout à bout que la première lignes des trois fichiers. Je voudrais qu'il mette bout à bout toutes les lignes des trois fichiers...
Je vais continuer à chercher, en espérant que c'est possible
Sécurité / Prévention
Répondre à Egwene
Je n'arrive qu'à afficher la première ligne concaténée, les autres n'apparaissent pas
| Citation : setlocal enabledelayedexpansion set C1=0 for /f "tokens=*" %%a in (%temp%\test5.txt) do ( endlocal |
Est-ce par ce que je ne m'y connais pas encore assez ou est-ce par ce que c'est tout bonnement impossible ?
Merci
Message édité par Egwene le 04-02-2009 à 22:31:41
Sécurité / Prévention
Répondre à Egwene
Tu y es presque.
Quand tu itères sur test5.txt, tu recommence à lire test6.txt du début, et donc il faut remettre le compteur du second fichier à 0 avant de lire le second fichier. Bref, ajoute un set /a C2=0 avant le second for.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Re,
J'ai trouvé, mais je me suis rallongé je pense :
| Citation : setlocal enabledelayedexpansion |
J'ai un peu bricolé ![]()
Je vais tester avec ton dernier conseil, histoire de raccourcir tout ça
Merci ! ![]()
edit: Ca marche nickel, merci t'es un chef !
Message édité par Egwene le 05-02-2009 à 13:27:57
Sécurité / Prévention
Répondre à Egwene
Il y a 295 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

CRicky