[BATCH] ... :)

... :) [BATCH] - Programmation

Marsh Posté le 25-01-2002 à 16:28:54    

Je crack...
 
Pkoi ça ... ça ne marche pas
 
file.bat
================================================
for %%R in (C:\MesDoc~1\fichier1
C:\MesDoc~1\fichier2
C:\MesDoc~1\fichier3
C:\MesDoc~1\fichier4
C:\MesDoc~1\fichier5
C:\MesDoc~1\fichier6) do call search.bat %%R
================================================
 
search.bat
================================================
for %%C in (chaine1
chaine2
chaine3
chaine4) do grep -i -l %%C %2 > resultat.txt
================================================
 
Je veux donc obtenir le résultat d'un grep pour plusieurs chaines dans plusieurs fichiers ..
 
mais j'ai sans cesse ceci :
 
 
STGF04 C:\MesDoc~1>C:\MesDoc~1\Commande ou nom de fichier incorrect
 
STGF04 C:\MesDoc~1>C:\MesDoc~1\
Commande ou nom de fichier incorrect
 
STGF04 C:\MesDoc~1>C:\MesDoc~1\Commande ou nom de fichier incorrect
 
STGF04 C:\MesDoc~1>C:\MesDoc~1\
Commande ou nom de fichier incorrect
 
STGF04 C:\MesDoc~1>C:\MesDoc~1\
Commande ou nom de fichier incorrect
 
STGF04 C:\MesDoc~1>C:\MesDoc~1\
Commande ou nom de fichier incorrect
 
STGF04 C:\MesDoc~1>C:\MesDoc~1\) d
call search.bat %R
Commande ou nom de fichier incorrect

Reply

Marsh Posté le 25-01-2002 à 16:28:54   

Reply

Marsh Posté le 25-01-2002 à 17:03:04    

1 - mettre sur une seule ligne si c'est pas le cas :
 
for %%R in (C:\MesDoc~1\fichier1 C:\MesDoc~1\fichier2 C:\MesDoc~1\fichier3 C:\MesDoc~1\fichier4 C:\MesDoc~1\fichier5 C:\MesDoc~1\fichier6) do call search.bat %%R  
 
2 - C'est %1 et pas %2 :
for %%C in (chaine1 chaine2 chaine3 chaine4) do grep -i -l %%C %1 > resultat.txt  
 
3 - Si tu fait > resultat.txt, tu n'aurra le resultat que du dernier GREP, donc
 
Dans file.bat, ajoute au début :
ECHO "RECHERCHE DE CHAINE" > resultat.txt
 
et dans search tu fait :
 
for %%C in (chaine1 chaine2 chaine3 chaine4) do grep -i -l %%C %1 >> resultat.txt
 
Cà devrait déjà aller mieux.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 25-01-2002 à 17:23:59    

Mara's dad a écrit a écrit :

1 - mettre sur une seule ligne si c'est pas le cas :
 
for %%R in (C:\MesDoc~1\fichier1 C:\MesDoc~1\fichier2 C:\MesDoc~1\fichier3 C:\MesDoc~1\fichier4 C:\MesDoc~1\fichier5 C:\MesDoc~1\fichier6) do call search.bat %%R  
 
2 - C'est %1 et pas %2 :
for %%C in (chaine1 chaine2 chaine3 chaine4) do grep -i -l %%C %1 > resultat.txt



 
oki merci...
 

Mara's dad a écrit a écrit :

 
 
3 - Si tu fait > resultat.txt, tu n'aurra le resultat que du dernier GREP, donc
 
Dans file.bat, ajoute au début :
ECHO "RECHERCHE DE CHAINE" > resultat.txt
 




 
ça j'ai pas trop compris l'histoire de l'écho ...mais je ne laisse pas > je mets >>
 

Mara's dad a écrit a écrit :

 
et dans search tu fait :
 
for %%C in (chaine1 chaine2 chaine3 chaine4) do grep -i -l %%C %1 >> resultat.txt
 
Cà devrait déjà aller mieux.  




 
Pour l'espace entre les chaines, j'aimerais bien le faire.. mais le probleme c'est que les chaines sont en fait le résultat d'un requete ... et le résultat fait a peu pres 800 lignes...
 
* = espace
 
exemple :  
 
chaine1*******
chaine2*******
chaine134*****
chaine116*****
chaine1BETA***
chaine1encore*
chaine1fiezh**
chaine9*******
 
Voilà ce que j'obtiens ..

 

[edtdd]--Message édité par paranoidandroid--[/edtdd]

Reply

Marsh Posté le 25-01-2002 à 22:42:51    

Bon, on commence par le ">" et le ">>"
 
Se sont des ordres de redirection de la sortie "Standard"
 
Par défaut, la sortie standard, c'est la "Console" (le prériphérique CON: ), c'est à dire l'écran dans 99.99999% des cas.
Donc si tu redirige la sortie, c'est pour que çà n'aille pas sur l'écran, mais ailleur, dans le fichier "resultat.txt" dans ton cas.
 
">" Va créer le fichier pour y mettre le résultat de l'opération. Donc si le fichier éxiste, il sera écrasé.
 
">>" Ajoute le résultat de l'opération à la fin du fichier. Si le fichier n'éxiste pas, il est créé.
 
ECHO est une commande qui envoie les paramètres sur la sortie standard (l'écran !)
Si tu fait :

Code :
  1. ECHO toto

, çà t'affiche simplement 'toto' à l'écran
Si tu fait :

Code :
  1. ECHO toto > resultat.txt

, çà crée (ou écrase s'il éxiste) le fichier resultat.txt qui contiendra donc 'toto'.
J'ai fait çà pour 2 raison :
1- M'assurer que le fichier soit vidé avant de mettre les résultats dedans.
2- Mettre une première ligne dans le fichier qui t'indique de quoi il s'agit.
 
Mais si cette ligne te gène, tu peux commencer par supprimer le fichier pour être certain de ne pas ajouter tes résultats à un fichier qui en contient déjà.
Pour faire propre :

Code :
  1. IF EXIST resultat.txt del resultat.txt


 
Maintenant, après ce long discours, j'ai une mauvaise nouvelle.
 
Quand tu fais :

Code :
  1. FOR %%R in (...) do ...

tu demande à l'interpréteur de commande d'éxécuter une commande (normal non, pour un interpréteur de commande !).
Le problème c'est qu'une commande DOIT tenir sur une seule ligne. La raison en est que c'est le caractère de fin de ligne (CR_LF) qui marque la fin de la commande.
D'autre part, et c'est là la mauvaise nouvelle, une commande ne peut dépasser une certaine taille. Je n'ai plus la limite en tête, mais 800 * 15 = 168000, c'est TROP !
 
Donc faut trouver une autre solution.
 
Par exemple :
Si au lieu de te sortir
chaine1
chaine2
chaine134
chaine116
chaine1BETA
chaine1encore  
chaine1fiezh
chaine9
 
ta requête pouvait faire çà :

Code :
  1. grep -i -l "chaine1       " %1 >> resultat.txt
  2. grep -i -l "chaine2       " %1 >> resultat.txt
  3. grep -i -l "chaine134     " %1 >> resultat.txt
  4. grep -i -l "chaine116     " %1 >> resultat.txt
  5. grep -i -l "chaine1BETA   " %1 >> resultat.txt
  6. grep -i -l "chaine1encore " %1 >> resultat.txt
  7. grep -i -l "chaine1fiezh  " %1 >> resultat.txt
  8. grep -i -l "chaine9       " %1 >> resultat.txt


Il suffit d'appeler ce fichier search.bat, et le tour est joué !

 

[edtdd]--Message édité par Mara's dad--[/edtdd]


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 26-01-2002 à 18:27:22    

En ce qui concerne la liste des grep ... un petit exe en C fera l'affaire, je dois aussi m'en servir pour interpreter les résultts à la fin.
 
Merci pour ton aide

Reply

Marsh Posté le 26-01-2002 à 19:07:50    

Tu devrais installer un vrai langage de script, genre perl ou mieux python.

 

[edtdd]--Message édité par Verdoux--[/edtdd]

Reply

Marsh Posté le 26-01-2002 à 19:31:01    

Verdoux a écrit a écrit :

Tu devrais installer un vrai langage de script, genre perl ou mieux python.  
 
 




 
python ?

Reply

Marsh Posté le 26-01-2002 à 19:45:09    

www.python.org
 
Le paradis des scripteurs :D

Reply

Marsh Posté le 26-01-2002 à 20:14:46    

En parlant de script, sur tout Windows qui se respecte (si c'est possible), il ya WSH (Windows Scripting Host) !
 
C'est quasiment inconnu, mais en fait il s'agit de JS (J Script, un Javascript à la sauce PetitMou).
 
Il y a deux façon de faire tourner un JS : Avec WScript ou avec CScript.
Comme leur nom l'indique, WScript fait tourner les scripts dans un environnement Windows alors que CScript fonctionne en mode console.
 
C'est à essayer au moins une fois pour se faire une idée.
 
Un exemple que j'avais fait pour remplacer un BATCH pour un gars du forum y'a pas si longtemp :
 

Code :
  1. function delFile( FolderSpec, FileSpec )
  2. {
  3. var fso, f, fc, s, c;
  4. c = 0;
  5. fso = new ActiveXObject("Scripting.FileSystemObject" );
  6. f = fso.GetFolder(FolderSpec);
  7.  
  8. // Suppression du fichier
  9. if (fso.FileExists(FolderSpec + "\\" + FileSpec))
  10. {
  11.  fso.DeleteFile( FolderSpec + "\\" + FileSpec );
  12.  c ++;
  13. }
  14. // Recherche dans les sous-répertoires
  15. fc = new Enumerator(f.SubFolders);
  16. for (; !fc.atEnd(); fc.moveNext())
  17. {
  18.  c += delFile( fc.item(), FileSpec );
  19. }
  20. return( c );
  21. }
  22. WScript.Echo( delFile( "c:\\temp", "test.txt" ) + " Fichiers supprimés !" );


 
C'est assez évident, mais se script sert à supprimer les fichiers (test.txt) du répertoire c:\temp ET de ses sous répertoires.
Une sorte de DEL /S c:\temp\test.txt en fait.
Sauf que l'option /s , ben elle existe pas !
 
Salut à vous tous, et n'hésitez pas à répondre à mon post  ;) :  
 
http://forum.hardware.fr/forum2.ph [...] c=1&trash=


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed