IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[BATCH] lire chaque ligne d'un fichier texte


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 46
    Points : 35
    Points
    35
    Par défaut [BATCH] lire chaque ligne d'un fichier texte
    Bonjour,
    oui je sais j'ai beaucoup de problème en ce moement mais je dois faire beaucoup de trucs que je ne connais pas et vite en plus!

    On m'a demandé d'éclater mon travail sur plusieurs scripts. Donc, pour les lier tous, j'ai créé un petit batch qui est censé exécuté un premier script en vbscript (il le fait très bien! ). Ce script écrit dans un ficheir les noms de tous les pc du réseau. Ensuite, dans le batch, je dois lire ce fichier ligne par ligne pour passer en paramêtre d'un autre script en vbscript le nom de chaque pc du réseau.

    Dans mon batch, j'ai donc mis en place une boucle qui est censée lire dans un fichier texte une ligne et passer ce qu'il a lu en paramètre d'un script. Mais ça ne marche pas! Enfin, ça ne marche plus!

    Hé oui, ça marchait hier, et depuis ce matin ça ne marche plus et je ne sais pas pourquoi car je n'ai rien changé.

    Voici le code de la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for /f %%i in (c:\TEMP\ListePC.rbi) do (
        echo %%i
        RechercheInfos %%i
    )
    Dans le ficheir ListePC.rbi, il y a un 20aine de lignes avec un mot sur chaque ligne.
    ex:
    CTETIOT
    POSTE-GHOST
    NICOLE
    PATRICK
    STETIOT
    Voilà l'affichage qui est produit:
    STETIOTHOST
    Du coup ça me fait tout foirer ce que j'avais prévu.
    Je pense que l'affichage est fait grâce au dernier nom du fichier texte compléter par les dernières lettres du nom le plus long, comme si la batch écrivait tout ce qu'il lit sur la même ligne par dessus ce qu'il avait écrit avant.

    Est-ce que quelqu'un voit d'où peut venir mon problème?
    Merci!

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Un call semble manquer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call RechercheInfos %%i

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 46
    Points : 35
    Points
    35
    Par défaut
    na c'est pas le call puisque ça marchait très bien sans.
    Le problème ne vient pas de l'appel de mon script mais de la lecture du fichier et de la boucle.
    Et là je ne vois pas d'où vient le problème.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 46
    Points : 35
    Points
    35
    Par défaut
    en désespoir de cause puisqu'il ne me reste plus que ça à mettre sur pied (et un petit truc mais c'est pas moi qu m'en occupe), j'ai testé avec un call.
    Je m'excuse, , il y a du mieux. Je vois que mon batch lit tous les noms de pc qui sont dans mon fichier mais il y a encore un problème.

    Avec ce nom qui est lu, le batch doit appeler ma fonction, donc une fois par ligne lue en gros.
    Mais là, le batch pète les plombs et met toutes les lignes bout à bout et ensuite appelle ma fonction.
    Ca donne un truc du genre:
    CTETIOTPOSTE-GHOSTNICOLEPATRICKSTETIOT
    donc c'est pas le pied en fait.

    Je remets le code de ma boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f %%I in (c:\TEMP\ListePC.rbi) do call RechercheInfos %%I
    Est-ce que quelqu'un peut m'aider svp?

    Merci!

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Communique nous le batch appelé, C++ mieux
    [edit]
    Sinon essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     For /F %%I in ('Type "c:\TEMP\ListePC.rbi"') do call RechercheInfos %%I
    [/edit]

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 46
    Points : 35
    Points
    35
    Par défaut
    bon ok mais alors juste le début parce qu'il est très long.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     ECRITURE DANS UN FICHIER
    '   Fichier = chemin vers le fichier (ex "c:\temp\exemple.txt")
    '   Contenu = chaîne de caractère à insérer dans le fichier 
    '   Ajouter = True  si l'on veut ajouter à la fin du fichier 
    '             False si l'on veut écraser le fichier
    Sub EcrireDansFichier(ByVal Fichier,ByVal  Contenu,ByVal  Ajouter)	
    	Dim LeMode
    	Dim FsError
    	Dim LeFichierTexte
    	If Ajouter = True Then	'On ajoute le texte à la fin du fichier
    		LeMode=8
    	Else					'On ecrase le fichier pour ajouter notre texte
    		LeMode=2
    	End If
    	Set FsError = CreateObject("Scripting.FileSystemObject")
    	Set LeFichierTexte = FsError.OpenTextFile(Fichier,LeMode, True)
    	LeFichierTexte.Write Contenu
    	LeFichierTexte.Close
    	Set	 LeFichierTexte = Nothing
    	Set FsError = Nothing
    End Sub
    
    Dim sComputerName	'As string
    Dim sWinMgmt		'As String
    Dim SP						
    Dim sText			'As String
    Dim tabul			'As Int
    Dim args
    tabul = -1
    
    'Machine à interroger ...
    'sComputerName = InputBox("Entrer le nom de l'ordinateur à interroger :",,"localhost")
    
    Set args = WScript.Arguments
    if args.Count=0 then 
        Wscript.quit
    end if
    sComputerName = args(0)
    'wscript.echo "PC: " & sComputerName
    'Repertoire où est situés le fichier de log de la machine
    Dim objShell
    Set objShell = WScript.CreateObject("WScript.Shell")
    Dim cFolder
    cFolder =  "c:\TEMP\"
    
    'On supprime le précédent s'il existe 
    'on inscript les informations de départ du script
    Call EcrireDansFichier(cFolder & sComputerName & ".xml", _
    		 "<?xml version=""1.0"" encoding=""ISO-8859-1""?>" & vbCrLf,False&#41; 
    Call EcrireDansFichier&#40;cFolder & sComputerName & ".xml", _
    		 "<Scan Author='frstatech' Computer='" & sComputerName _
    		 & "' date='" & cstr&#40;Now&#40;&#41;&#41; _
    		 & "'>" & vbCrLf,true&#41;
    
    'Chaine de Connexion à la ruche WMI
    sWinMgmt = "winmgmts&#58;&#123;impersonationLevel=impersonate&#125;!//" & sComputerName &""
    
    '-------------------
    'System
    '-------------------
    call DebutInfo&#40;"System",sText,tabul&#41;
    
    'Role
    Dim objRole 'As WMI Object connecté à la ruche Win32_ComputerSystem
    On Error Resume next
    Set objRole = GetObject&#40; sWinMgmt &#41;.InstancesOf&#40;"Win32_ComputerSystem"&#41; 
    'si il y a une erreur, on supprime le fichier et on sort du programme
    if err <> 0 then 
        kill "c&#58;\TEMP\" & sComputerName & ".xml"
        Wscript.quit
    end if
    Y a juste besoin de voir ça car le reste marche, c'est cette partie là qui foire avec le script.

    Donc pour expliquer, on passe en paramêtre un nom de pc, le script créé un xml à partir de ce nom (nompc.xml) et puis ensuite essaye de "scanner" cet ordi.

    Généralement, ça bloque dans la procédure qui écrit le fichier.
    Au fait, c'est du vbscript donc je sais pas si ça va dans ce forum là maintenant!

    En totu cas merci de m'aider car là je patauge

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bartmarley
    Au fait, c'est du vbscript donc je sais pas si ça va dans ce forum là maintenant!
    Oui je vois !
    Citation Envoyé par bartmarley
    En tout cas merci de m'aider car là je patauge
    Bah, on sera deux comme ça
    Il est peut être préférable dans le fichier batch (.bat) de préciser l'appel de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CScript //I //NoLogo RechercheInfos.vbs
    Cela documente ton script !
    Donc le Call proposé, n'a pas lieu d'être dans ce contexte.
    Par contre pour le second script, comme j'ai pas tout compris dans les specs, difficile de t'aider.
    Essaie 5-10 appels hors de la boucle, la boucle ne me semble pas en cause.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CScript //I //NoLogo RechercheInfos.vbs Station1
    CScript //I //NoLogo RechercheInfos.vbs Station2
    CScript //I //NoLogo RechercheInfos.vbs Station3
    CScript //I //NoLogo RechercheInfos.vbs Station4

    Essaie le debugger de script ici
    Je suis pas certain que cela soit le debugger approprié, faut tester.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 46
    Points : 35
    Points
    35
    Par défaut
    Le truc c'est que je sais que mon script marche bien car je l'ai testé des dizaines de fois depuis le début de la semaine.
    Pour le faire marche, il suffit que je me mettes dans son répertoire et je l'appelle comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RechercheInfos Station1
    Et ça ça marche nickel. Je n'ai jamais eu de problèmes avec ce script cette semaine.
    Les ennuis sont arrivés avec la mise en place de la boucle donc je me demandais ce qui se passait dans cette boucle.

    Grosso modo si la première ligne de mon fichier texte est CTETIOT, que va valoir %%I dans l'expression RechercheInfos %%I?

    Je ne connais pas très bien, voire pas du tout le dos, et je suis donc un peu perdu avec ça, en plus ce n'est pas la doc qui court sur le net!

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bartmarley
    Le truc c'est que je sais que mon script marche bien
    A mon avis en support c'est la première erreur à ne pas commettre.
    Citation Envoyé par bartmarley
    car je l'ai testé des dizaines de fois depuis le début de la semaine.
    Ton environnement a pu changer.
    Citation Envoyé par bartmarley
    Les ennuis sont arrivés avec la mise en place de la boucle donc je me demandais ce qui se passait dans cette boucle.
    L'affichage seul de la variable est-elle correcte (pas d'appel du second script) ?
    poste1
    poste2
    Citation Envoyé par bartmarley
    Grosso modo si la première ligne de mon fichier texte est CTETIOT, que va valoir %%I dans l'expression RechercheInfos %%I?
    et bien CTETIOT. Mais il faut s'assurer que la création du fichier contenant les noms de poste respecte la régle suivante :
    un nom de machine par ligne, chauqe ligne séparé par un retour chariot.
    Vérifie les régles par défaut d'un boucle /F , cf. clause Token
    Citation Envoyé par bartmarley
    Je ne connais pas très bien, voire pas du tout le dos,
    Je ne pense pas que cela soit un pb de DOS étant donnée que tu es sous NT

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 46
    Points : 35
    Points
    35
    Par défaut
    L'affichage seul de la variable n'est pas bon! Je ne sais pas comment l'afficher mais quand j'affiche le paramêtre que j'envoie à mon script c'est pas bon.
    Ca m'affiche quelquechose du genre: toutes les lignes de mon fichier texte mises bout à bout.

    Pourtant mon fichier texte est correctement formaté. Il y a un nom de poste sur chaque ligne et mon retour chariot est fait avec un variable de vb (vbcr) donc je ne vois pas d'où vient le problème.

    C'est vraiment pénible d'être coincé avec ça.
    J'ai contourné le problème pour l'instant avec un programme en java qui fait la même chose mais on me demande de le faire avec un batch donc il faut que je réussisse.

    Conclusion, le problème doit venir de la boucle. Pourquoi?
    1- en java, la lecture du fichier ligne par ligne ne pose pas de problème.
    2- le paramêtre passé à mon script n'est pas bon

    Mais après, je n'en sais pas plus sur l'origine du problème.

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Tes conclusions me semblent erronées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    C&#58;\Temp>type listepc.rbi
    poste_A
    poste_B
    poste_C
    Poste_C
    
    C&#58;\Temp>type test.cmd
    @echo off
    For /F %%I in &#40;'Type "c&#58;\TEMP\ListePC.rbi"'&#41; do echo %%I
    
    
    C&#58;\Temp>test
    poste_A
    poste_B
    poste_C
    Poste_C
    C&#58;\Temp>
    Un commentaire ?
    [edit]
    un retour chariot sous Windows est constitué de CR et de LF
    Chr(10)+Chr(13)
    [/edit]

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 46
    Points : 35
    Points
    35
    Par défaut
    je m'excuse, tu as raison.
    en fait en faisant type listePC.rbi, je me suis retrouvé avec une grosse connerie d'affichée.

    Mon erreur ne venait donc pas de mon script rechercheinfos (j'avais quand même à moitié raison ) ni de ma boucle comme tu me le disais.
    Mon erreur venait de mon tout premier script, celui qui listait les ordis du réseau. J'utilisais vbcr au lieu de vbcrlf donc kan je regardais mon fichier avec un éditeur de texte je n'avais aps de problème mais avec le type on voit la différence.

    En tout cas je te remercie de ton aide qui a été fort précieuse pour m'ouvrir les yeux (j'aurais pas du sortir hier soir! )

    Merci et bon week-end!

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bartmarley
    je m'excuse, tu as raison.
    C'est ta démarche de "dépannage" qui est à revoir. Personnellement je fais encore l'erreur mais de moins en moins.
    Citation Envoyé par bartmarley
    En tout cas je te remercie de ton aide qui a été fort précieuse pour m'ouvrir les yeux
    Se remettre en cause c'est pas toujours évident ...

    Citation Envoyé par bartmarley
    Merci et bon week-end!
    A toi aussi.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 46
    Points : 35
    Points
    35
    Par défaut
    en tout cas c'est cool, je connaissais pas la commande type.

    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire les paramètres de chaque ligne d'un fichier text
    Par kooll77 dans le forum Fortran
    Réponses: 1
    Dernier message: 19/01/2011, 13h29
  2. Lire une ligne dans un fichier texte
    Par stpaul04 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 28/07/2009, 14h06
  3. Lire une ligne et colonne fichier texte
    Par Naoli dans le forum Général Python
    Réponses: 4
    Dernier message: 24/11/2007, 12h56
  4. Réponses: 3
    Dernier message: 13/11/2007, 15h45
  5. Réponses: 2
    Dernier message: 08/11/2007, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo