[batch] Problèmes et questions
Dernière réponse : dans Programmation
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*.txtfor /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
Lassé par la pub ? Créez un compte
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.
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.
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 !
J'ai testé avec la variable %path%
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 !
Citation :
del %temp%\test*.txtSET "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 !
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.
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 simpleMerci 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*.txtSET "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
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
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
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/
Bonsoir CRicky,
Merci pour toutes ces informations.
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 :super:
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 :super:
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
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
Je n'arrive qu'à afficher la première ligne concaténée, les autres n'apparaissent pas
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
Citation :
setlocal enabledelayedexpansionset 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
Re,
J'ai trouvé, mais je me suis rallongé je pense :
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é
Je vais tester avec ton dernier conseil, histoire de raccourcir tout ça
Merci ! :super:
edit: Ca marche nickel, merci t'es un chef !
J'ai trouvé, mais je me suis rallongé je pense :
Citation :
setlocal enabledelayedexpansionset 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é
Je vais tester avec ton dernier conseil, histoire de raccourcir tout ça
Merci ! :super:
edit: Ca marche nickel, merci t'es un chef !
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumBatch windows probleme lecture fichier cache
- ForumProbleme encodage fichier batch
- ForumQuestions facebook
- ForumProbleme de boucle for dans un batch
- ForumProbleme de retour avec un fichier batch
- ForumBatch probleme syntaxe
- ForumBatch
- ForumBatch probleme variable et boucle for
- ForumProbleme vba excel 3 questions de debutant
- ForumVlc batch probleme
- Voir plus