Tom's Guide > Forum > Programmation > Problèmes Batch.
Page :    Page Précédente 1 2 3 4 5 6 7 8 Page Suivante Bas de page Chercher dans ce sujet
Mot :    Pseudo :           
 

Hello,

Je viens ici poster différents problèmes que j'ai rencontré en batch, et venir vous demander des explications ;)

Je vais donc vous poster des extraits de batch où ça coince :

1)

Code :
  1. for /f "tokens=*" %%A in ('dir "%systemdrive%\" /S /AD /B ^| find /i "BAK"') do if /i '%%~nA'=='BAK' (
  2. dir /b /a-d "%%A" >nul 2>nul
  3. if %errorlevel%==0 (
  4. for /f "tokens=*" %%B in ('dir /B /A-D "%%A"') do (
  5. cd "%%~dpA"
  6. if exist %%B (
  7. echo -^(BAD^)- %%~dpA%%B     
  8. echo -^>  -^(LEGITIME^)- %%A\%%B
  9. echo.
  10. echo.)))) >> "%desktop%\LZ.log"


Ici, il y a un problème d'errorlevel.
J'ai des fichiers introuvables qui apparaissent en console, il semble y avoir un problème avec l'errorlevel dans les boucles FOR. Un développeur m'a conseillé de traiter la chose à partir d'un fichier texte.

2)

Code :
  1. for /f "tokens=1-5 delims=: " %%A in ('systeminfo ^| find /i "totale"') do set mem=%%D %%E > NUL



Et j'obtiens finalement ça : Mémoire vive totale : 2ÿ046 Mo

3)

Code :
  1. (echo Contenu du Fichier Hosts: & echo.) >> dir.txt
  2. set /a modif=0 >nul
  3. for /f "eol=# tokens=1-2" %%A in (%windir%\system32\drivers\etc\hosts) do  ( if NOT %%A==127.0.0.1 ( echo %%A %%B ^>^> Ligne Modifiée !
  4. set /a modif+=1
  5. ) ELSE (
  6. echo %%A %%B
  7. )
  8. ) >> dir.txt
  9. if '%modif%'=='0' (echo. & echo Aucune ligne Modifiée ;^)
  10. ) ELSE (
  11. (echo. & echo /!\ %modif% lignes modifiée^(s^) ! /!\ ) >> dir.txt
  12. )



Deux problèmes :
- Sur l'ordinateur d'une autre personne, toutes les lignes s'affichent modifiées, pourtant je ne spécifie pas de délimiteurs (or ceux par défaut sont l'espace et la tabulation, donc je ne comprends pas où est le problème).
- J'avais envie que la ligne ::1 dans le fichier Hosts (qui correspond au localhost) ne soit pas mis en ligne modifiée, mais je n'y arrive pas.

4) @echo off & cls
dir /A "*.%1" >> var.log
dir /A "%2" >> var.log
var.log & del var.log
exit

Pour le %2, ça marche pour %windir%, %systemdrive%\, mais étrangement pas pour %programfiles%, une idée ?

5) for %%A in (%windir%\bak\skytel.exe) do (set var=%%^~dpA& set var=%var:bak^\=%& echo %var%)
Or, cela m'affiche %var% .. Mon but est d'obtenir seulement %windir% (j'aurais aimé faire ça sur un groupe de fichiers).
Il semblerait que le problème soit que ce soit un groupe de fichiers qui soit traité dans une boucle for.
Car l'assignation et le fait de transtyper la variable marche autrement (commande dans un boucle for, ou quand on est pas dans une boucle for).

Voilà, merci pour vos réponses !

------------------------------ >> Centre de Formation Helpers <<
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.
- 0 +

et eric veut pas t'aider ? :D


Message édité par OmaR le 02-08-2008 à 09:33:07
Répondre à OmaR

Ça va faire trois mois que c'est dans ses MP :lol: :lol:

 

Enfin, il a beaucoup de boulot plus ses deux programmes en batch, donc je le laisse tranquille à part de temps en temps sur la cat :)

 

Pour mon dernier problème, on a pas trouvé de soluce.


Message édité par XmichouX le 02-08-2008 à 10:30:29
------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX
- 0 +

A mon avis ton 4), ça doit être à cause de l'espace qu'il y a dans "Program Files".

Sinon le reste c'est du batch trop compliqué pour moi :)

Répondre à OmaR

Il servira à quoi ce fameux programme ?

A+

:)

Répondre à liblabrute

Hello,

Ce sont tous des fragments de programme.
Il n'y en a même qui ne sont pas des programmes, mais des essais de commande.

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Oui j'avais remarqué que les programmes n'étaient pas entiers ;)

Mais le but du programme final ce sera quoi ?

A+

Répondre à liblabrute

Il n'y a pas de programme final ! :)
Ils n'ont rien en commun. Ce sont juste des problèmes que j'ai eu avec ces parties là ;)

 

@omar,
pourtant je mets des guillemets comme çash : "%programfiles%"


Message édité par XmichouX le 02-08-2008 à 21:57:22
------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Ah okey :)

Merci ;)

Vous faites du bon boulot :)

Répondre à liblabrute

1), j'imagine que c'est comme pour les variables. Je pense qu'il faudrait tester l'expansion retardée des variables (et donc remplacer les % en !).
http://www.infos-du-net.com/forum/ [...] hier-texte

 

2) que donne ceci:

Code :
  1. systeminfo ^| find /i "totale"


ajout un echo de mem après le for pour être spur que le problème vient du for.

 

3) qu'affichent %%A et %%B ?

 

4) As-tu testé en enlevant les guillemets dans le script et en les mettant lors de l'appel? (je ne me rappelle plus comment le batch interprète 2 guillemets).

 

5) Déjà dans le DO, utilise plusieurs lignes plutôt que les & et utilise l'expansion retardée des variables.


Message édité par CRicky le 04-08-2008 à 15:50:41
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Hello Cricky :)

1) Donc !! ou setlocal enableextensions ?

2) Mémoire physique totale: 2 046 Mo
Voilà. Il y a bien un espace (logiqument) entre le 2 et 046.

3) %%A affiche l'adresse IP et %%B le domaine correspondant.
Ex : 127.0.0.1(%%A) localhost (%%B)

4) ça ne change rien, c'est un mystère ..

5) Il me semble avoir déjà essayé les deux options que tu m'as indiqué, sans succès.
je viens de ressayer ça ne marche pas :

@echo off & cls
setlocal enableextensions
for %%A in (%windir%\bak\skytel.exe) do (
set var=%%^~dpA
set var=%var:bak^\=%
echo %var%)
pause


Truc bizarre... La raison du pourquoi j'ai regroupé les instructions avec le & est qu'ici, le message qui apparaît est "commande echo désactivée", comme si le %var% derrière n'était pas présent.

Merci ;)
[Je pars en vacances, serai de retour dans ~2 semaines]

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

1) je ne crois pas que ça fasse partie des extensions (peut-être), on peut activer l'expansion en modifiant une clé dans la base de registre ou lancer cmd avec le commutateur qui va bien. Bref, dans tous les cas, une fois activée, il faut l'utiliser cette expansion avec !var!

2) Et l'affichage de mem donne quoi ? Si c'est pareil, fait un echo %%D %%E
Tu as peut-être aussi un problème d'expansion retardé. Ce qui est bizarre c'est que le caractère espace 0x20 semble se transformer en 0xFF.

3) Essaie en ajoutant des guillemets dans le if:
if NOT "%%A"=="127.0.0.1"
Je les mets toujours, mais je ne sais plus si c'est obligatoire.

4) Enlève le @echo off et montre tout :)

5) comme tu sépares les commandes, il te faut utilise l'expansion retardée !var!. Dans ta boucle VAR est toujours vide car var est effectivement modifié après le for. Donc tu fais un "echo" vide qui affiche donc ce message.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Hello,

1) Pour setlocal si ;)

ENABLEEXTENSIONS / DISABLEEXTENSIONS
active ou désactive les extensions de commandes. Entrez
CMD /? pour plus de détails.
Je testerai quand je serai de retour :)

2) L'affichage de mem c'est ça : 2ÿ046 Mo
Tu penses que je devrais essayer avec un set local et les ! ? J'essaierai donc de retour ;)

3)

Citation :

if NOT "%%A"=="127.0.0.1"


Déjà fait, mais je peux toujours ressayer (avec la personne concernée par le "beug" ).
Normalement, on doit pouvoir mettre ou bien rien ou bien des ' ou bien des " autour des variables ?..?

4) Sans guillemets à programfiles en argument ( mais il y en a déjà autour de la variable dans le bat!)
C:\Users\Antoine\Desktop>dir /A "*.exe" 1>>var.log

C:\Users\Antoine\Desktop>dir /A "C:\Program" 1>>var.log
Fichier introuvable

C:\Users\Antoine\Desktop>var.log & del var.log

avec guillemets :

C:\Users\Antoine\Desktop>dir /A ""C:\Program Files\"" 1>>var.log
Le fichier spécifié est introuvable.


Maintenant des guillemets en trop :lol:

5)

Citation :

Donc tu fais un "echo" vide qui affiche donc ce message.


logiquement, même si la variable est nule, ça devrait afficher %var% et non pas rien comme si je demandais l'état de la commande, non ?
Euh je remplace quels %% , tous ?
For !!A ?
ça ne marche pas.
Sinon si je remplace les % que dans la boucle, !var! apparaît à l'écran.



------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

1) ça ne dit toujours pas que que l'expansion retardée fait partie des extensions ;)

2) ou tester en mettant toi-même les delims

3) Le problème avec le batch, c'est que ça a évolué avec les OS :)

4) Teste ce que j'avais dis: pas de guillemet dans le batch, et des guillemets à l'appel

5)

Citation :


logiquement, même si la variable est nule, ça devrait afficher %var% et non pas rien comme si je demandais l'état de la commande, non ?


les variables en batch c'est comme les #define en C, ce n'est que tu remplacement de textedonc si la variable est vide ta commande devient "echo " ce qui affiche le message.

Citation :

Euh je remplace quels %% , tous ?
For !!A ?


Dans les boucles FOR, ce ne sont pas vraiment des variables d'environnements (d'ailleurs on n'utilise pas %A% mais bien %A ou %%A dans un script).
Donc, le FOR garde son %%A, c'est juste pour les variables d'environnement (avec un SET) où il faut mettre !var!

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Hello :)

1) En faisant comme ça :

setlocal enableextensions

for /f "tokens=*" %%A in ('dir "%systemdrive%\" /S /AD /B ^| find /i "BAK"') do if /i '%%~nA'=='BAK' (
dir /b /a-d "%%A" >nul 2>nul
if !errorlevel!==0 (
for /f "tokens=*" %%B in ('dir /B /A-D "%%A"') do (
cd "%%~dpA"
if exist %%B (
echo -^(BAD^)- %%~dpA%%B
echo -^> -^(LEGITIME^)- %%A\%%B
echo.
echo.
)))) >> "%desktop%\LZ.log"
endlocal

Plus de message d'erreur apparemment, mais la recherche ne se fait pas correctement. Les fichiers trouvés ne s'affichent plus :p

2) Que veux-tu dire ? Il y a déjà delims spécifié dans ma boucle.

3) :D

4) Bravo, ça marche :)
Curieux quand on y réfléchit.
En mettant des guillemets dans le batch et pas de guillemets pour %programfiles% à l'appel, ça ne marche pas, alors que l'inverse marche. Sans compter le fait que le problème ne se pose qu'avec cette variable.

5) Bah pourtant si je fais :

set var=
echo %var%

C'est %var% qui s'affichera. Je n'ai pas du bien comprendre :p

Sinon ça me met !var! :s :p

merci!

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

1) quelle est la partie qui coince?

2) Il te manque peut-être des caractères de délimitation ;)

4) quand tu ne mets pas de guillemet au lancement, l'interpréteur y voit un second paramètre (ce qui est logique), donc avant le lancement du .bat, le répertoire est déjà découpé par l'interpréteur "appelant", tu ne faisais que mettre des variable autour du paramètre découpé.

5) c'est parce que tu n'as pas activé l'expansion retardé (qui est différent de enableextension).
Dans un for, une variable d'environnement (j'exclus évidemment les %%A, %%B, etc) n'est effectivement modifié que lorsque la ligne de commande (donc le for) est terminé. Donc ça t'affiche la variable, mais si tu la modifie dans la boucle, alors pendant toute la boucle elle aura la même valeur, et seulement une fois la boucle terminée, elle aura la valeur finale.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Hello,

1) Je ne sais pas trop, j'ai fait une capture d'écran pour te montrer.
Je précise que j'ai un fichier C:\Windows\Skytel et j'ai mis un fake dans C:\Windows\BAK pour le programme, donc normalement, ils doivent apparaître (et apparaissaient) dans le rapport final ce qui en se produit pas.

On dirait que ça coince sur la variable %%B ?

http://www.zimagez.com/miniature/sanstisdftre.jpg

En plus de ça, il y a les problèmes d'accès aux dossiers de jonctions de Vista, ce qui met la pagaille :p

2) Penses-tu à la tabulation ?
Je suis déçu, j'ai fait ce test en console :
for /f "tokens=1-3*" %A in ('systeminfo ^| find /i "totale"') do echo %D

Il s'affiche bien 2 046 mo

Je refais dans mon batch :
for /f "tokens=1-3*" %%A in ('systeminfo ^| find /i "totale"') do set mem=%%D > NUL
Et même résultat qu'avant :p

4) Un peu de mal à comprendre, mais je vois bien que ce n'est pas simple à expliquer ;)

5) Ok :)

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

1) ajoute des echo un peu partout pour voir si ça fait bien les for et if

2) Redirige dans un fichier et regarde en hexa ce qu'il y a entre 2 et le 0

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

1 )

Tu veux dire : Mettre des echo quelque chose à chaque ligne quasiment ?

2) En hexa je fais comment ? :D

Merci ;)

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

1) oui

2) notepad++ avec le plugin HEX-editor ;)

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Yop,

Pour le plugin, j'ai téléchargé la dll zippée sur sourceforge.net, j'ai mis la dll dézippée dans le dossier plugin de notepad ++. Mais apparemment le plugin n'est pas compatible.

J'ai vu qu'il y avait un logiciel Hex Editor , j'utilise celui-là ? ;)

Pour le un, je posterai avec ma prochaine réponse .

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Pourquoi pas compatible? tu n'as pas le petit bouton "H" vers la fin ? ni Plugins>HEX-Editor>View in Hex

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Hello,

Voici une image (ma version de Notepad ++ est normalement à jour, la mise à jour automatique étant activée).

http://www.zimagez.com/miniature/dfstre.jpg

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Récupère les 2 parties ici:
http://notepad-plus.sourceforge.ne [...] hp?lang=fr


Message édité par CRicky le 29-08-2008 à 21:18:07
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Yop,

"2" parties ?
Je ne suis pas sûr de comprendre.
Je me suis rendu en bas de la balle pour les plugins et celui-là en particulier qui m'a mené sur cette page :
http://sourceforge.net/project/sho [...] _id=222593

Ou le fichier à télécharger est finalement le même que celui téléchargé.
Ou bien dois-je prendre le patch ? (seulement ou en plus)

Merci

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX
- 0 +

A mon avis, les 2 parties = Notepad++ et le plugin ;-)

Répondre à OmaR

oui les 2 parties: notepad++ et plugin HEX-Editor
http://sourceforge.net/project/sho [...] _id=102072
http://sourceforge.net/project/sho [...] _id=222593


Message édité par CRicky le 30-08-2008 à 11:19:03
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Ah cette fois, ça marche :)

J'ai ça :

0d 0a 32 ff 30 34 36 20 4d 6f 0d 0a

Si tu veux plus de précisions, je peux faire un screen ^^

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

C'est bien ce que je pensais, tu n'a pas d'espace (0x20) entre le 2 (0x32) et le 4 (0x34), mais un 0xFF.
Essaie en copie ce caractère pour l'ajouter en delims dans le FOR, c'est pas sûr que ça marche comme c'est un caractère spécial.
En fait, je pense que ça a été fait exprès pour que lorsqu'on découpe par espace on puisse prendre tout le nombre parce qu'on ne sait pas combien d'espace il y a dans le nombre. Donc si le for avec le caractère 0xFF fonctionne il faudra faire une seconde boucle for pour éliminer ce caractère.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Citation :

En fait, je pense que ça a été fait exprès pour que lorsqu'on découpe par espace on puisse prendre tout le nombre parce qu'on ne sait pas combien d'espace il y a dans le nombre


Malin en effet, je ne serais pas arrivé à cette conclusion.

Mais bon il suffit de faire ça en tokens=unnombre-l'autre* et le problème est réglé normalement pour voir tout le nombre.

Par contre désolé, mais j'ai du mal à suivre pour l'opération que je dois faire dans mon for ;)
Tu veux dire copier le caractère spécial et le mettre en delims c'est bien ça ?

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

En fait pas besoin d'imbriquer, une fois que tu as fais ta variable, tu peux faire un for /F sur la commande 'echo %tavariable%' que tu peux donc découper (non testé).

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Mais vu que le délimiteur est un caractère apparemment mal interprété, le problème est le même, il faut que j'arrive à le mettre dans delims, non ?

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Oui, et si tu ne peux pas, je ne vois pas comment faire ça simplement.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Hello,

 

Mémoire vive totale : 2ÿ046 Mo

 

Toujours ça :D

 

Avec ceci dans le batch :

 

for /f "tokens=1-3* delims=ÿ " %%A in ('systeminfo ^| find /i "totale"') do set mem=%%D > NUL

 

Le truc c'est qu'en console, ce caractère n'apparaît pas, où bien il est mal interprété et interprété comme un espace.

 

-----------

 

Pour l'autre en changeant la partie comme ça :

 

setlocal enableextensions

 

for /f "tokens=*" %%A in ('dir "%systemdrive%\" /S /AD /B ^| find /i "BAK"') do if /i '%%~nA'=='BAK' (
dir /b /a-d "%%A" >nul 2>nul
echo youpi
if !errorlevel!==0 (
echo Youpi2
for /f "tokens=*" %%B in ('dir /B /A-D "%%A"') do (
cd "%%~dpA"
echo yOUpi3
if exist %%B (
echo Youpi4
echo -^(BAD^)- %%~dpA%%B
echo -^> -^(LEGITIME^)- %%A\%%B
echo.
echo.
)))) >> "%desktop%\LZ.log"
endlocal

 

J'obtiens dans le log final :

 

youpi
youpi
youpi

 

(jai trois dossiers bak)

 

Donc ça coince à nouveau au niveau de l'errorlevel, avant ça l'exécutait tout le temps, et là ça n'exécute rien, enfin je crois.


Message édité par XmichouX le 01-09-2008 à 12:05:06
------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

On en revient au même problème: as-tu activé l'expansion retardée des variables d'environnement ?

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Je n'avais pas mi le bon truc, en effet, c'est setlocal enableDelayedExpansion.

Le résultat est :

ça marche impeccable :)
Donc, moral de l'histoire, activer l'expansion retardée, si on met des conditions dans des boucles ou des conditions , c'est ça ?
Je vais essayer voir si ça le fait pour mon fichier Hosts :)

Merci. Te tiens a ucourant.

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

oui cette option est pour utiliser le !var! au lieu de %var% dans les boucles et variables

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Hello :)

Le problème est résolu pour le 5 grâce à l'expansion retardée. :) !

pour le 3), tu penses que ça peut se régler avec l'expansion retardée ?
Je n'ai pas réussi, mais je n'avais que des variables de type for ..

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Je ne pense pas que ça règle le 3)

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Ok :)

Donc on peut le considérer comme insoluble :p

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Hello,

 

Can you help me for an other thing ?

 

J'avais un exercice sur un forum où je devais trouver une technique pour quelque chose à faire, j'ai choisi le batch : je me sers de ça

 

for /F %%A in ('dir /B /AD "%userprofile%"') do ( echo %%A ) >> youpi.log

 

Enfin c'était pas la même chose , mais vu que ça ne marchait pas, j'ai mis seulement un echo %%A.
Mais je n'arrive pas à obtenir le nom entier des dossiers, à partir du moment où ils comprennent des espaces.
Note: j'ai essayé "%%A", mais ça ne marche pas mieux, can you help me plz ?

 


Le truc que je comprends pas, c'est qu'une fois, j'avais fait un batch similaire pour un personne et les noms des dossiers s'affichaient correctement voir ce sujet :
http://www.infos-du-net.com/forum/ [...] es#t321096

 

Dans le sujet, tu verras que les noms d'utilisateurs s'affichent bien.

 

Je vois peut être pas une différence qui est grosse comme une maison ... ?


Message édité par XmichouX le 26-09-2008 à 19:25:08
------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

En fait dans le for /F, l'espace et la tabulation sont les séparateurs par défaut, donc si tu as 2 espaces, tout va être séparer dans %%A, %%B et %%C.
Bref, je vois 2 possibilités:
- soit tu redéfinis les délimitateur, et tu n'en mets aucun: FOR /F "delims=" %%A ...
- soit tu gardes le délimitateur par défaut, et tu indiques ton propre découpage de morceaux, en disant que tu veux tout le reste (avec *) dès le début: FOR /F "tokens=*" %%A ...

 

Dans ton autre exemple, tu as la seconde solution. Personnellement, je préfère plutôt le première. ;)


Message édité par CRicky le 26-09-2008 à 20:36:59
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Citation :

En fait dans le for /F, l'espace et la tabulation sont les séparateurs par défaut, donc si tu as 2 espaces, tout va être séparer dans %%A, %%B et %%C.


Ah mais oui! Qu'est-ce qui m'arrive, j'avais complètement zappé ça. Merci !

En fait, quand j'ai posté dans ce sujet, j'ai du oublier le "tokens=*" , car dans mon exercice, je l'ai bien mis, mais le batch ne marche tout de même pas correctement.

Je t'explique vite fait la chose (c'est pas un exercice en fait) :

Dans %userprofile%, un virus cherche les sous dossiers, et se copie dans chaque sous dossier sous cette forme : [nomdudossier].exe

Donc j'ai fait ça :

Code :
  1. @echo off & cls
  2. cd %userprofile%\my documents
  3. set malware=0
  4. for /F "tokens=*" %%A in ('dir /AD /B') do ( if exist "%%A\[%%A].exe" (
  5. set malware+=1
  6. taskkill /F /IM "%%A.exe"
  7. del /A /F /Q "%%A\[%%A].exe"
  8. if exist "%%A\[%%A].exe" (
  9. echo Unable to delete [%%A].exe !
  10. ) else ( echo [%%A].exe deleted successfully !
  11. ))) >> Kill.log
  12. if %malware%==0 (echo No Treath Detected !) >> Kill.log



Or, cela ne marche pas.

Réponse :

Citation :

Something went wrong on my testcomputer

I created this file:

C:\Documents and Settings\Administrator\My Documents\tun235\tun235.exe

But kill.log says:
No Treath Detected !
No Treath Detected !
No Treath Detected !



Comprends-tu pourquoi ?


Je remarque le même type d'erreur sur le mien, en faisant ceci :

Code :
  1. @echo off & cls
  2. cd %userprofile%
  3. for /F "tokens=*" %%A in ('dir /B /AD "%userprofile%\"') do ( cd "%%A"
  4. echo %CD%
  5. cd.. ) >> youpi.log
  6. youpi.log & del youpi.log
  7. exit



J'obtiens :

Citation :

C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine
C:\Users\Antoine


Je me demande si les jonctions de vista ne pourraient pas poser problème, mais de toute façon, ça ne se limite pas à ça, j'ai du faire une erreur ? mais laquelle .. je ne trouve pas

En tout cas, merci beaucoup ! J'espère que c'est pas un truc bête, sinon ça veut dire que j'ai complètement régressé.

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Je pense que ton répertoire courant est bien changé, et que c'est juste un problème d'affichage de %CD% comme la variable d'environnement est modifiée dans la boucle, elle n'est effectivement modifiée qu'une fois la boucle terminée.
C'est encore un problème d'expansion retardée, donc active-le et utilise echo !CD!

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Hello,

 

Effectivement, c'est bien ça :)

 

Je me demande pourquoi je n'y ai pas pensé, toujours utiliser l'expansion retardée dans une boucle, si on utilise une variable.

 

En ce qui concerne l'autre, as-tu une idée ?

 

Sinon je vais essayer de détourner le truc comme ceci :

 
Code :
  1. @echo off & cls
  2. cd %userprofile%\my documents
  3. set malware=0
  4. for /F "tokens=*" %%A in ('dir /AD /B') do ( cd "%%A"
  5. if exist "%%A.exe" (
  6. set malware+=1
  7. taskkill /F /IM "%%A.exe"
  8. del /A /F /Q "%%A.exe"
  9. if exist "%%A.exe" (
  10. echo Unable to delete %%A.exe !
  11. ) else ( echo %%A.exe deleted successfully !
  12. ))
  13. cd..) >> Kill.log
  14. if %malware%==0 (echo No Treath Detected !) >> Kill.log
 

?

 

Merci ! Mais bon, logiquement, il devrait marcher celui d'avant.
Je vais lui demander de changer le batch parce que j'avais mis des crochets autour du %%A alors qu'y en a pas .


Message édité par XmichouX le 27-09-2008 à 11:42:11
------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Oui essaie le nouveau, et pour l'autre ajoute des traces pour savoir ce qui se passe vraiment :)

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Oki, merci !

Je lui ai demandé de refaire sans les crochets. Si ça ne marche toujours pas, je mettrai des echo un peu de partout pour voir ce que ça donne.

Merci, je te tiens au courant ;)

D'ailleurs, un peu plus tard peut-être, est-ce que tu es accessible pour des questions sur l'hexadécimal ? (Entre autre dans le registre)

------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX

Pose toujours la question, quelqu'un d'autre peut aussi te répondre ;)

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Oki, ce sera un peu plus tard.

 

Alors pour le batch (sans les []), je l'ai essayé sur mon XP.

 

J'ai mis dans le dossier Bureau, Bureau;exe, et pareil pour d'autres dossiers.

 

Résultat, le batch n'ouvre pas de log.
Seulement le fichier qui est trouvé dans le premier dossier est supprimé et le programme ferme.

 

Il doit y avoir un problème .. Je vais essayer de voir si je peux le faire apparaître ;)

 

edit: Je n'arrive à rien avoir de concluant (j'ai enlevé echo off & mis une pause après l'arrêt du processus et la suppression) :

 
Citation :


C:\Documents and Settings\Toinou\Bureau>cd C:\Documents and Settings\Toinou\

 

C:\Documents and Settings\Toinou>set malware=0

 

C:\Documents and Settings\Toinou>for /F "tokens=*" %A in ('dir /AD /B') do (if e
xist "%A\%A.exe" (
set malware+=1
taskkill /F /IM "%A.exe" 1>nul
pause
del /A /F /Q "%A\%A.exe"
pause
if exist "%A\%A.exe" (echo Unable to delete %A.exe ! ) else (echo %A.exe delet
ed successfully ! )
) ) 1>>Kill.log

 

C:\Documents and Settings\Toinou>(if exist ".limewire\.limewire.exe" (
set malware+=1
taskkill /F /IM ".limewire.exe" 1>nul
pause
del /A /F /Q ".limewire\.limewire.exe"
pause
if exist ".limewire\.limewire.exe" (echo Unable to delete .limewire.exe ! ) el
se (echo .limewire.exe deleted successfully ! )
) ) 1>>Kill.log

 

C:\Documents and Settings\Toinou>(if exist ".VirtualBox\.VirtualBox.exe" (
set malware+=1
taskkill /F /IM ".VirtualBox.exe" 1>nul
pause
del /A /F /Q ".VirtualBox\.VirtualBox.exe"
pause
if exist ".VirtualBox\.VirtualBox.exe" (echo Unable to delete .VirtualBox.exe !
) else (echo .VirtualBox.exe deleted successfully ! )
) ) 1>>Kill.log

 

C:\Documents and Settings\Toinou>(if exist "Application Data\Application Data.ex
e" (
set malware+=1
taskkill /F /IM "Application Data.exe" 1>nul
pause
del /A /F /Q "Application Data\Application Data.exe"
pause
if exist "Application Data\Application Data.exe" (echo Unable to delete Applica
tion Data.exe ! ) else (echo Application Data.exe deleted successfully ! )
) ) 1>>Kill.log

 

C:\Documents and Settings\Toinou>(if exist "Bootvis\Bootvis.exe" (
set malware+=1
taskkill /F /IM "Bootvis.exe" 1>nul
pause
del /A /F /Q "Bootvis\Bootvis.exe"
pause
if exist "Bootvis\Bootvis.exe" (echo Unable to delete Bootvis.exe ! ) else (ec
ho Bootvis.exe deleted successfully ! )
) ) 1>>Kill.log

 

C:\Documents and Settings\Toinou>(if exist "Bureau\Bureau.exe" (
set malware+=1
taskkill /F /IM "Bureau.exe" 1>nul
pause
del /A /F /Q "Bureau\Bureau.exe"
pause
if exist "Bureau\Bureau.exe" (echo Unable to delete Bureau.exe ! ) else (echo
Bureau.exe deleted successfully ! )
) ) 1>>Kill.log
Erreur : le processus "Bureau.exe" est introuvable.


Donc là, j'ai copié pendant la pause.
Bon le processus est pas lancé, donc c'est normal, je rappuie sur une touche, ça supprime Bureau.exe, je rappuie, du texte défile très vite, et ça se coupe, je n'ai le temps de rien faire, je vais essayer d'ajouter une pause, mais je ne pense pas que ça va marcher .. ça ne marche pas ^^

 

J'ai regardé le log :

 

ça donne ça

 
Citation :

Appuyez sur une touche pour continuer ...
Appuyez sur une touche pour continuer ...
Appuyez sur une touche pour continuer ...
Bureau.exe deleted successfully !
No Treath Detected !

 

Alors là, je vois pas ce qui marche, je pensais au else. Mais la suite s'exécute, et la variable malware n'est pas bien modifiée..


Message édité par XmichouX le 27-09-2008 à 12:42:13
------------------------------ >> Centre de Formation Helpers <<
Répondre à XmichouX
Page Précédente
1 2 3 4 5 6 7 8
Tom's Guide > Forum > Programmation > Problèmes Batch.
Aller à :

Il y a 2107 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Liens