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

Scripts/Batch Discussion :

action sur chaque caractère d'une variable


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut action sur chaque caractère d'une variable
    Bonjour à tous

    Je galère en batch depuis quelques jours pour faire quelque chose de simple mais je ne trouve vraiment pas la solution
    Ce que je voudrais :
    variable=1001 => pas de soucis pour entrer cette valeur dans la variable
    nb=compter le nombre de caractère => pas de soucis
    ou je bloque c'est à partir de maintenant
    je voudrais faire caractère par caractère à :
    valider que le caractère n'est pas différent de 0 ou 1
    puis
    pour i = nb-1 jusqu'à i=0
    1*2^(i)+0*2^(i)+0*2^(i)+1*2^(i) =>> donne le résultat en base de dix, le dernier doit être un 0

    pour montrer que j'ai pas mal cherché avant :
    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    set variable=1001
    set U=0
    set resultat=0
    set /a nb=%nb%-1  rem nb étant le nombre de caractère dans variable
    for /l %%v in (%nb%, -1, 0) do (   rem ma boucle qui décompte en fonction du nombre de caractère, mis a nb-1 pour prendre en compte le z&ro
    <div style="margin-left:40px">echo %%v rem j'affiche bien mon décompte, sera supprimé après</div><div style="margin-left:40px">set /a resultat=%variable:~0,1%rem permet de garder seulement le caractère pour mon calcul cette ligne sera certainement égale à voir plus bas</div><div style="margin-left:40px">echo %resultat%rem permet d'afficher le résultat à chaque boucle, il sera mis après la boucle for, juste histoire de contrôler l'avancer</div><div style="margin-left:40px">set /a U=%U%+1</div>)

    ma ligne de calcul
    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set /a resultat= %resultat% + (%variable:~%U%,1%)*2^%%v rem permettra de faire mon calcul comme expliqué plus haut car U est incrémenté et v est décrémenté
    actuellement sans faire le calcul, lorsque j’exécute, il ne mets pas dans la variable résultat le chiffre et quand j'essaie d’intégrer ma variable (même avec un caractère d'échappement sur ma ligne de calcul, il ne veut pas.

    Si quelqu'un peut m'aider

  2. #2
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Salut,

    ça serait peut-être plus simple de nous dire quel est la finalité de ton script.

    Mais dans tout les cas tu dois utiliser l'expansion retardée pour les variables qui change dans ta boucle FOR ou sinon passer par un CALL.

    Exemple :

    sans expansion retardée :

    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @echo off
    for /L %%a in (1,1,10) do (
       set $test=%%a
       echo %test%)

    Sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    Comme tu le vois seul la dernière valeur est interpreté.

    Pour corriger cela. 2 méthode :

    1- Avec l'expansion retardée :

    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @echo off
     
    setlocal enabledelayedexpansion
    for /L %%a in (1,1,10) do (
       set $test=%%a
       echo !$test!)

    2- En passant par un call :

    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off
     
    for /L %%a in (1,1,10) do (call:suite %%a)
    exit/b
     
    :suite
    set $test=%1
    echo %$test%

    Sortie dans les 2 cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    Pour to calcul qui retourne la valeur avec un 0 à la fin (si j'ai bien compris ce que tu veux...) :


    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @echo off
    set "$valeur=1001"
    set /a $resultat=%$Valeur% -(%$Valeur% %%10)
    echo %$resultat%

    Sortie :
    Ou sans faire de calcul :

    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @echo off
    set "$valeur=1065"
    set $resultat=%$valeur:~0,-1%0
    echo %$resultat%



  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    Merci pour ces pistes, je vais les approfondir dès lundi au travail
    pour ce qui est de la finalité, me faire un petit convertissconvertisseur binaire-decimal-hexadecimal (je sais que ça existe deja) mais le but est de comprendre comment avoir le résultat plutôt que d'avoir le résultat
    Petit travail intellectuel pour apprendre un langage

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    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
    rem permet d entrer la valeur a convertir
    :binaire_decimal
    cls
    set variable= rem initialisation de la valeur
    echo "Conversion binaire vers decimale"
    set /p variable="saisir un chiffre binaire : " rem saisie de la valeur par l utilisateur
    call :compte_caract rem appel de la fonction pour compter le nombre de caracteres
    set /a nb=%nb%-1 
    for /l %%v in (%nb%, -1, 0) do (call :extraction %%v) rem boucle pour extraire les caracteres un par un et appel del a fonction extraction
    pause
    goto:eof
    
    :compte_caract
    echo %variable% rem affiche la valeur a convertir
    set nb= rem initialise la variable nbr
    for /f "tokens=1,* delims=[,]" %%A in ('"%comspec% /u /c echo:%variable%|more|find /n /v """') do set /a nb=%%A-4 rem compte le nbr de variable
    goto:eof
    
    :extraction
    set position=%variable:~0,-1% rem la partie qui me pose probleme, je voudrai utiliser cette syntaxe mais en incorporant la valeur envoyer lors de l appel de la fonction, donc remplacer le -1 par %%v
    echo %position% rem juste me sers a tester l integration de ma variable
    set $resultat=%position% rem ici sera le calcul decris sur un post au-dessus
    echo %$resultat% rem affiche le resultat
    pause
    goto:eof
    Voila, j'ai réussi à faire pas mal, ce code fonctionne mais comme je l'ai mis dans les remarques, la première ligne de la fonction extraction me pose soucis, je n'arrive pas à intégrer ma variable, le code comme il est fonctionne mais ne me sers à rien sans cette position.

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    Merci sachadee, je passerai dorénavant par des call, peux tu m'expliquer rapidement (en vulgarisant) ce qu'est une expansion retardée ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/03/2015, 15h11
  2. [Toutes versions] [débutant] condition sur une case par ligne, et action sur chaque ligne
    Par touille dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/06/2010, 17h17
  3. test sur la fin d'une variable caractère
    Par caro92 dans le forum SAS Base
    Réponses: 3
    Dernier message: 25/09/2009, 09h43
  4. petite question sur la récupération d'une variable
    Par minusette dans le forum Langage
    Réponses: 6
    Dernier message: 17/11/2005, 16h57
  5. Changer chaque caractère d'une chaîne
    Par YanK dans le forum Langage
    Réponses: 13
    Dernier message: 08/07/2005, 19h01

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