Lire une variable contenu dans un fichier durant une boucle ? - Shell/Batch - Programmation
Marsh Posté le 27-04-2015 à 19:10:46
Eh ben... Je tire mon chapeau devant les gens qui savent utiliser cette cochonnerie de batch!
Pour le problème le seul truc qui fonctionne chez moi c'est mettre le traitement dans une fonction qu'on appelle:
Code :
|
selon http://stackoverflow.com/questions [...] n-for-loop
Apparemment c'est un truc avec ENABLEDELAYEDEXPANSION mais j'ai pas réussi à faire fonctionner, peut-être qu'à l'intérieur d'une boucle ça ne marche pas??
Marsh Posté le 29-04-2015 à 17:47:15
Hello,
merci pour ta réponse; j'ai utilisé ta méthode mais je rencontre du coup un autre problème.
Le "ErrorLevel" retourné par ma commande FINDSTR est toujours égal à 1 et jamais à 0 (chaine de caractère trouvée).
Voilà un bout de mon code si quelqu'un à une idée; je sèche pour l'instant
Code :
|
Merci
Marsh Posté le 29-04-2015 à 21:53:38
Je suis pas sûr de comprendre ce que tu veux faire... findstr sert à chercher des choses à l'intérieur d'un fichier, c'est bien ça que tu veux ou plutôt comparer des chaînes de caractères? (je pense à la ligne findstr %1 D:\Dir_CD.txt)
Marsh Posté le 29-04-2015 à 22:38:46
Je veux chercher si une chaine de caractères qui est présente dans le fichier "FileItemWithPath.txt" est également présente dans le fichier DIR_CD.txt
En gros le fichier "DIC_CD.txt", contient un dir de tous mon disque dur avec donc le nom de chaque fichier de mon disque ligne par ligne.
Le fichier "FileItemWithPath.txt" contient des noms de fichiers (sous la forme c:\chemin\fichier.txt).
Le but de la boucle est de chercher dans DIR_CD si chaque ligne de "FileItemWithPath" est présente.
Merci pour tes lumières
Marsh Posté le 29-04-2015 à 23:07:10
Citation : Le "ErrorLevel" retourné par ma commande FINDSTR est toujours égal à 1 et jamais à 0 (chaine de caractère trouvée). |
C'est apparemment un problème avec les backslash...
Ceci fonctionne:
Dans un même dossier:
test.bat
Code :
|
et FileItemWithPath.txt
Code :
|
Sur D:\
Dir_CD.txt
Code :
|
Si je remets les '\' ou '\\', autrement dit si je change c:dossierfichier.txt en c:\dossier\fichier.txt ou c:\\dossier\\fichier.txt dans les deux fichiers ça ne fonctionne plus... Je sais pas pourquoi.
Mais dis, tu es obligé de te servir de batch? Parce que avec un language correct (p.ex. Perl) ça serait bien plus facile!!
Marsh Posté le 29-04-2015 à 23:13:25
Ok, si il y a que des '\' (et non des doubles '\\') faut mettre /L en paramètre à findstr et ça semble fonctionner.
Marsh Posté le 30-04-2015 à 10:07:50
Merci pour ta réponse mais j'ai apparemment toujours le même problème même avec le /L à mon findstr si je l'insère dans un batch et qu"une variable d'environnement est traduite.
En gros,
Code :
|
Code :
|
Cependant dans mon .bat, j'ai toujours un ERRORLEVEL à 1 même avec le "/L" :
Code :
|
Si dans mon fichier FileItemWithPath.txt, j'ai c:\windows\test.dll ca fonctionne.
Si par contre j'ai %systemroot%\test.dll ca ne fonctionne pas (bien que l'echo me montre bien que le chemin "traduit" est fourni à findstr (donc c:\windows).
Voilà, si tu as une idée je suis preneur. (et pour répondre à une de tes idées, je ne peux donc malheureusement pas supprimer les "\" de mon fichier "FileItemWithPath" car le fichier contient des variables d'environnement (par ex %sytemroot%) qui inclut des "\" par défaut.
=)
Marsh Posté le 30-04-2015 à 11:33:42
Apparemment c'est un problème lié à la casse.
Suivant que les lettres sont en majuscules ou minuscules ca marche ou pas ... On a moyen de jouer sur la casse dans un batch ?
Marsh Posté le 30-04-2015 à 12:59:31
RTFM
findstr /? pour avoir l'aide
findstr /I (i majuscule) pour ignorer la casse (non testé)
Marsh Posté le 30-04-2015 à 14:55:57
Oui sorry, j'avais trouvé entre temps; juste avant de partir dej et je comptais venir te l'indiquer !
Merci encore; heureusement que t'es là =)
Pour répondre à ta question concernant PERL plutôt que BAT, reprends moi si je me trompe mais il n'y a pas d'interpréteur PERL par défaut sur Windows; du coup je risque d'avoir du mal à exécuter ce script sur chacun de mes postes comme je l'imaginais.
Marsh Posté le 30-04-2015 à 15:04:48
Effectivement sur Windows il faut installer Perl avant de pouvoir l'utiliser...
edit: Apparemment il existe une version portable (qu'il ne faut donc pas installer) de Strawberry Perl mais c'est un gros machin (102.2 MB)... Et faire le programme en C(++) pour avoir un exécutable ça me paraît pas plus facile (enfin selon si on s'y connait)...
Strawberry: http://strawberryperl.com/releases.html
Marsh Posté le 30-04-2015 à 15:21:42
Ouais effectivement ca ne va pas etre simple de déployer 100Mo sur les postes
Bon mon prochain défi avec batch va être d'identifier les lettres de lecteur des disques dur (pas lecteur réseau, ni cd, etc...)
Je viendrais t'embêter si je continue à rester bloqué sur le sujet ;-)
Marsh Posté le 04-05-2015 à 15:11:04
Me revoilà avec un nouveau souci; cette fois plutôt liée à la logique d'exécution dans un fichier BAT.
Voici le script me permettant de récupérer la liste des drives et d'exécuter un DIR pour chaque lecteur et le consolider dans un fichier global.
Code :
|
Ce que j'aimerai est que le "call displayinfo" se fasse uniquement sur la partie ":displayinfo" mais que la partie "etape 2" et le reste du script ne soient pas inclus dans la boucle qui fait le "do call displayinfo".
Est-ce que quelqu'un aurait une idée de comment indiquer la fin de l'exécution d'une boucle en bat ?
Merci
Marsh Posté le 27-04-2015 à 17:18:51
Salut à tous,
une question toute bête mais je n'ai pas trouvé ma réponse.
Je cherche à exécuter une commande via une boucle dans un fichier batch.La particularité est que le fichier appelé dans ma boucle peut contenir un chemin défini par un path. Or via mon script, le path n'est pas interprété.
Voici un exemple de script :
Et dans mon fichier FilePath.txt, j'ai
%windir%\moi.txt
C:\WINDOWS\system32\test.txt
La ligne "%windir%\moi.txt" n'est pas traduite en C:\WINDOWS\moi.txt et par conséquent ca ne fonctionne pas.
Qu'est ce que j'oublie ?
Merci