Votre question

[batch] Problèmes et questions

Tags :
  • Batch
  • Programmation
Dernière réponse : dans Programmation
1 Février 2009 17:34:35

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

for /F "skip=3 tokens=1" %%A in ('tasklist') do ( echo %%~nA%%~xA %%~tA %%~zA >>%temp%\test1.txt )

notepad %temp%\test1.txt
pause


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.

;) 

Autres pages sur : batch problemes questions

a b L Programmation
1 Février 2009 20:30:52

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.
1 Février 2009 21:00:17

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 !

;) 
Contenus similaires
Pas de réponse à votre question ? Demandez !
1 Février 2009 22:27:25

J'ai testé avec la variable %path%

Citation :
del %temp%\test*.txt

SET "PATH=%systemroot%\system32;%PATH%;%systemroot%\system32\drivers"

for /F "skip=3 tokens=1" %%A in ('tasklist') do ( echo %%~ftz$PATH:A>>%temp%\test1.txt )

notepad %temp%\test1.txt
pause


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 !

;) 
a b L Programmation
2 Février 2009 21:46:17

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

Citation :
Et quitte à débuter alors, tu conseillerais quel langage ?

Je te laisse deviner :p 

Pour le PATH, tu peux le mémoriser dans une variable avant de le toucher pour le remettre comme avant à la fin.

2 Février 2009 21:57:16

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

SET "PATH=%systemroot%\system32;%PATH%;%systemroot%\system32\drivers;%programFiles%\Avira\AntiVir PersonalEdition Classic"

echo ------------------------------------[Processus running]-------------------------------------->>%temp%\test2.txt
echo. >>%temp%\test2.txt

for /F "tokens=1" %%A in ('tasklist /nh') do ( echo %%A %%~tz$PATH:A>>%temp%\test1.txt )
for /F "tokens=1-4*" %%A in (%temp%\test1.txt) do (
If not exist %%E ( echo %%A>>%temp%\test2.txt ) else ( echo [%%B-%%C] ^(%%D^) %%E>>%temp%\test2.txt))

notepad %temp%\test2.txt
pause


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


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 :p  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 :D  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 :whistle: 

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 :p  ), 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 :D 

;) 
a b L Programmation
3 Février 2009 20:25:22

Citation :
Tu pourrais me donner un exemple simple ?

simple, non :p 
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 :)  Je prends note du conseil, sinon j'avais pensé à C++, tant qu'à faire autant y aller franchement.

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/

3 Février 2009 22:37:27

Bonsoir CRicky,

Merci pour toutes ces informations.

Citation :
tu incrémentes un autre compteur.


C'est bien ça que je n'arrive pas à visualiser... :D 

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

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 :super:
4 Février 2009 17:51:25

C'est encore moi Cricky :D 

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 ? :D 

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 ;) 
a b L Programmation
4 Février 2009 19:35:28

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.
4 Février 2009 20:04:04

Oki, merci Cricky :) 

Citation :
tu incrémentes un autre compteur.


Et pour le compteur ? :D 
4 Février 2009 21:27:21

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 :D 
4 Février 2009 22:31:06

Je n'arrive qu'à afficher la première ligne concaténée, les autres n'apparaissent pas :( 

Citation :
setlocal enabledelayedexpansion

set C1=0
set C2=0

for /f "tokens=*" %%a in (%temp%\test5.txt) do (
set /A "C1+=1"
for /f "tokens=*" %%b in (%temp%\test6.txt) do (
set /A "C2+=1"
If !C1!==!C2! echo %%a %%b>>%temp%\test9.txt ))

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 ;) 
a b L Programmation
5 Février 2009 00:08:44

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.
5 Février 2009 13:22:40

Re,

J'ai trouvé, mais je me suis rallongé je pense :

Citation :
setlocal enabledelayedexpansion
set C1=0
set C2=0
Set C3=0
for /f "tokens=*" %%a in (%temp%\test5.txt) do (
set /A "C1+=1"
echo.!C1!^|%%a^|>>%temp%\test10.txt)
for /f "tokens=*" %%b in (%temp%\test6.txt) do (
set /A "C2+=1"
echo.!C2!^|%%b^|>>%temp%\test11.txt)
for /f "tokens=*" %%c in (%temp%\test7.txt) do (
set /A "C3+=1"
echo.!C3!^|%%c>>%temp%\test14.txt)
for /f "tokens=*" %%a in (%temp%\test10.txt) do (
for /f "tokens=*" %%i in (%temp%\test11.txt) do (
for /f "tokens=*" %%x in (%temp%\test14.txt) do (
echo.%%a%%i%%x>>%temp%\test9.txt)))
for /f "tokens=1-6 delims=^|" %%A in (%temp%\test9.txt) do (
If %%A==%%C If %%A==%%E If %%E==%%C echo.%%B- %%D - %%F>>%temp%\test12.txt)
endlocal
notepad %temp%\test12.txt
pause


J'ai un peu bricolé :D 

Je vais tester avec ton dernier conseil, histoire de raccourcir tout ça ;) 

Merci ! :super:

edit: Ca marche nickel, merci t'es un chef ! ;) 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS