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] gestion de N paramètres clé="valeur"


Sujet :

Windows

  1. #1
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut [batch] gestion de N paramètres clé="valeur"
    RereBonjour (c'est la troisieme fois que je recommence ce message ).

    voilà je dois modifier un script batch afin qu'il accepte en paramètre un nombre inconnu de paramètre de type CLE="VALEUR". (en fait 6 param fixes et de 0 à 6 cle="valeur") et je suis à la recherche de qques idées ...

    Un exemple vaut mieux qu'un long discours. En gros fo que je puisse faire :

    script 1 2 3 4 5 6
    script 1 2 3 4 5 6 PREFIX="TOTO_"
    script 1 2 3 4 5 6 PREFIX="TOTO_" TRACE="YES"
    ...

    En plus cette modif portant sur plusieurs scripts, je désire utiliser un script générique qui effectuera le traitement des params. Je dois donc lui transmettre les paramètres recus.

    Ya t'il moyen de récupérer la ligne de commande ? Sinon je passe par un shift et une concaténation des paramètres.

    Autre problème (c'est surtout ça le but de ma question), comment gérer le caractère =

    parce que si je fais
    script 1 2 3 4 5 6 PREFIX="TOTO_"
    je récupère PREFIX et "TOTO_" en 2 arguments différents. Le caractère = à l'air de jouer le rôle de séparateur. Donc si j'ai 6 paramètres cle="valeur" c'est un peu galère pour traiter les couples ...

    bref en résumé :
    - suis-je obligé de passer par une concaténation ?
    - suis-je obliger de galérer pour traiter mes clé="valeur" ? (oui je suis obligé de prendre le = )
    - avez-vous des super idées bien classes ?


    merci d'avance. toute suggestion est la bienvenue ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  2. #2
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut
    Salut !

    J'ai rien compris,esque c'est moi,ou !?

    On tout les cas,pour récupérer les paramètres passés un fichier bat ,voila un example :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    echo Le premier recu par ce batch est %1
    echo Le second  est %2
    echo Le troisieme  est %3
    echo Le quatrieme  est %4

    L'execution du fichier bat (sous DOS) sera par example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fichier.bat param1 param2 param3
    A+
    Plus tu prends part aux joies et chagrins des gens, plus ils te sont proches et chers. Mais c'est le chagrin et les problèmes qui vous rapprochent le plus.

    (Mark TWAIN)

  3. #3
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Bon tu dois pas etre le seul à n'avoir rien compris.

    je cherche 2 choses.

    1) transmettre les paramètres reçus par un script à un autre en utilisant si possible autre chose que la concaténation de ces parametres en une chaine que je devrais traiter en plus. (j'ai potentiellement 12 parametres et tu n'est pas sans savoir que ya rien apres %9)

    2) trouver un moyen pour gérer les paramètres de type CLE="VALEUR". Si je fais

    script CLE="VALEUR"

    je recupere 2 parametres : %1 -> CLE %2 -> "VALEUR"
    et vu que je veux traiter de 0 à 6 params comme ça c'est un peu galère car je peux avoir

    CLE1="VAL1" CLE2="VLA2" CLE5="VAL5" CLE6="VAL6"

    si je les recupere "séparément" je vais devoir tester le token n et le token n+1 de la chaine concaténée (pour l'instant) et bon c'est possible mais pas tres cool. je cherche donc une eventuelle alternative ...


    en esperant avoir été plus clair ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  4. #4
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut
    Re !

    Ok,trés claire

    Y avais une command ou option de commande qui permet de ne pas prendre en charge les délémiteur(ou même de les spécifier,genre 'delmite=/' pour rendre '/' le délimiteur par default)dont je ne me souvien pas ,dsl

    On tout les cas,voila un site de référence pour moi :

    http://home7.inet.tele.dk/batfiles/batfiles.htm

    Je vais essayer d'y jeter un coup d'oeil pour voire si je peu t'aider



    Pour l'instant,il faut que je dorme un peu


    Bonne chance !
    Plus tu prends part aux joies et chagrins des gens, plus ils te sont proches et chers. Mais c'est le chagrin et les problèmes qui vous rapprochent le plus.

    (Mark TWAIN)

  5. #5
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    bon ... je galère toujours autant.

    j'ai donc décidé de concaténer les paramètres et de transmettre la chaine au script générique.

    je me retrouve donc avec une chaine de type
    1$2$3$4$5$6$a$"oo"$b$"xxx"

    en ayant passé en paramètre
    1 2 3 4 5 6 a="oo" b="xxx"

    je souhaite découper cette chaine et traiter les paramètres. j'utilise donc la boucle suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FOR /F "tokens=1,2,3,4,5,6,7,8,9,10,11,12 delims=$" %%i IN ("%1") DO (
    set var1=%%i 
    set var2=%%j 
    set var3=%%k
    set var4=%%l
    set var5=%%m
    set var6=%%n
    ...
    )
    les 6 premiers pas de pb ils sont obligatoires. J'affecte simplement des variables.

    par contre pour la suite ça se corse.
    la 7ème variable peut aussi bien être a que b que c ...
    je dois donc tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if "%%o"=="a" set a=%%p
    if "%%o"=="b" set b=%%p
    ...
    et ce pour toutes les valeurs %%o %%q %%s %%u ...

    avez vous une manière propre de faire ceci. genre saut inconditionnel et retour à la boucle ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  6. #6
    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
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    script 1 2 3 4 5 6 "PREFIX=TOTO_"  "TRACE=YES" "V= un deux"
    Utilise les guillemets pour récupérer le caractère = , ensuite parse avec l'instruction For /F.

  7. #7
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    excuse moi mais pourrais tu etre plus clai en ce qui concerne le for ?

    je vais tout de meme essayer, c'est vrai que j'y avais pas pensé à mettre des "" autour de tout. par contre si j'ai un truc du style

    1 2 3 4 5 6 "LOG_PATH=C:\Program Files\avec des espaces"

    je suis pas sur que je m'en tirerais comme ça ...

    Bon je continue à bricoler.

    merci
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  8. #8
    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
    SAlut,
    Citation Envoyé par in
    je suis pas sur que je m'en tirerais comme ça ...
    C'est un peu tordu avec les batch, c'est vrai.
    Essaie ça :
    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
    @echo off
    echo %1
    echo %2
     rem Parse le nom de paramètre et son contenu
     rem Place le contenu dans 2 variables d'environnement
    for /F "tokens=1,2 delims==" %%A in ('echo %1') do Set P1=%%A&Set P2=%%B
    Echo P1
    Echo P2
     rem Extrait la sous-chaîne du caractère 2 jusqu'a la fin
    set NewP1=%P1:~1%
     rem Extrait la sous-chaîne du caractère 1 jusqu'a (la fin-1)
    set NewP2=%P2:~0,-1%
    Echo %NewP1%
    Echo %NewP2%
    Pause
     rem "On libère les ressources"  ;-)
    set P1=
    Set P2=
    Set NewP1=
    Set NewP2=
    Testé avec MonBatch "NomParamètre=C:\Program files\t un\fichier.txt"

  9. #9
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Bon, merci de ton aide.

    je n'ai pas essayé ton dernier script car j'ai l'impression (pour l'instant) que tout fonctionne.

    je met toujours mon script au cas où ça serve à quelqu'un. et je tag résolu dès que j'ai testé plus sérieursement ...

    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
    :TRAITEMENT_CLASSIQUE
    :: set the first 6 parameters to avoid the shifting
    SET API_INSTANCE=%1
    SET USERPM=%2
    SET PWDPM=%3
    SET LOGUSER=%4
    SET PWDUSER=%5
    SET FLATFILE=%6
    SET FILE_MIN=cost
    SET FILE_MAJ=Cost
    
    :: keywords param have to be treated
    :: to know which parameter we are treating (the 6 first have not to be treated)
    set /a nbParam=0
    
    :: control the parameters and set the environment variables
    :param
    if [%1]==[] goto done
    	
    set /a nbParam+=1
    if %nbParam% LEQ 6 ( goto test_pos ) else ( goto test_key )
    
    
    
    :: test if the parameter is like key=value
    :: if yes, an error is raised and the process exits
    
    :test_pos
    set test=
    for /F "tokens=1,2 delims==" %%i in ('echo %1') do (
    	if not "%%j%"=="" set test=bad
    ) 
    
    if "%test%"=="bad" goto error1
    shift
    goto param
    
    
    
    :: test if the parameter is like key=value
    :: if not, an error is raised and the process exits
    :: else the environment variable is set
    
    :test_key
    set test2=
    for /F "tokens=1,2 delims==" %%i in ('echo %1') do (
    	if "%%j%"=="" set test2=bad
    )
    
    if "%test2%"=="bad" ( goto error2 ) else ( set %1 )
    shift
    goto param
    
    
    :done
    :: the generic script can be called. Environment variables are set, so no parameter to send.
    CALL inject_generic.cmd

    PS : j'aurais bien essayé ta soluce mais comme en même temps j'essaie d'apprendre, je vais garder cette solution un peu moins propre ...

    merci en tout cas
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  10. #10
    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 in
    je vais garder cette solution un peu moins propre ...
    Disons qu'elle est "bavarde" mais si ça rempli l'objectif c'est une solution.
    Maintenant faudra voir avec le temps et la maintenance

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

Discussions similaires

  1. Paramètre dynamique avec valeur null
    Par nanouille56 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 21/11/2006, 13h22
  2. Paramètre liste de valeur
    Par dwinkel dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2005, 08h39
  3. [CR8.5] Init paramètre plage de valeurs
    Par juelo dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 08/04/2005, 16h19

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