BATCH - Séparer les caractères d'une variable
Résolu
Fonx2
Messages postés
348
Statut
Membre
-
T0MuX -
T0MuX -
Bonjour,
Je suis actuellement en train de programmer un Batch et voila plus de 2h que je me prend la tête pour essayé de comprendre pourquoi sa ne marche pas! J'ai chercher partout sur le net mais impossible de trouver!!
Voici le code:
Un petit bout de code tout simple, mais qui NE FONCTIONNE PAS!!
En effet, voici ce qui s'affiche dans la fenêtre d'invite de commande:
"C:\Temp>set /a DateConcerne=100509
C:\Temp>set /a J=09
Nombre non valide. Les constantes numériques doivent être soit décimales (17),
soit hexadécimales (0x11), soit octales (021).
C:\Temp>set /a M=05
C:\Temp>set /a A=2010
C:\Temp>echo 100509 5 2010
100509 5 2010
C:\Temp>pause
Appuyez sur une touche pour continuer..."
J'ajoute que j'ai aussi essayer d'écrire "set /a J=%DateConcerne:~4,2%" avec le même résultat!
Pourquoi tant de haine?!!???
Je suis actuellement en train de programmer un Batch et voila plus de 2h que je me prend la tête pour essayé de comprendre pourquoi sa ne marche pas! J'ai chercher partout sur le net mais impossible de trouver!!
Voici le code:
set /a DateConcerne=100509 set /a J=%DateConcerne:~-2% set /a M=%DateConcerne:~2,2% set /a A=20%DateConcerne:~0,2% echo %DateConcerne% %J% %M% %A% pause
Un petit bout de code tout simple, mais qui NE FONCTIONNE PAS!!
En effet, voici ce qui s'affiche dans la fenêtre d'invite de commande:
"C:\Temp>set /a DateConcerne=100509
C:\Temp>set /a J=09
Nombre non valide. Les constantes numériques doivent être soit décimales (17),
soit hexadécimales (0x11), soit octales (021).
C:\Temp>set /a M=05
C:\Temp>set /a A=2010
C:\Temp>echo 100509 5 2010
100509 5 2010
C:\Temp>pause
Appuyez sur une touche pour continuer..."
J'ajoute que j'ai aussi essayer d'écrire "set /a J=%DateConcerne:~4,2%" avec le même résultat!
Pourquoi tant de haine?!!???
A voir également:
- BATCH - Séparer les caractères d'une variable
- Caractères spéciaux - Guide
- Fichier batch - Guide
- Caractères ascii - Guide
- Séparer pdf - Guide
- Caracteres speciaux - Guide
7 réponses
hello
pas besoin d'utiliser le /a si il n'y a pas de calcul
C:> set /a DateConcerne="100509"
100509
C:> set J=%DateConcerne:~-2%
C:> echo %J%
09
pour enlever le 0 devant si on veut faire des calculs:
C:> set /a J=1%J%-100
9
pas besoin d'utiliser le /a si il n'y a pas de calcul
C:> set /a DateConcerne="100509"
100509
C:> set J=%DateConcerne:~-2%
C:> echo %J%
09
pour enlever le 0 devant si on veut faire des calculs:
C:> set /a J=1%J%-100
9
Re, ( exusez moi pour le retard à raison d'un prb de déconnection internet ) ;)
pour qu'il ya deux cas spéciale ( 08 et 09 ) voici la démarche :
@echo off
set /a DateConcerne="100509"
set /a M="%DateConcerne:~2,2%"
set /a A=20"%DateConcerne:~0,2%"
if "%DateConcerne:~-2%" == "08" (echo %DateConcerne% %DateConcerne:~-2% %M% %A%)
if "%DateConcerne:~-2%" == "09" (echo %DateConcerne% %DateConcerne:~-2% %M% %A%)
if "%DateConcerne:~-2%" NEQ "09" (set /a J="%DateConcerne:~-2%"&&echo %DateConcerne% %J% %M% %A%)
pause
karirovax
pour qu'il ya deux cas spéciale ( 08 et 09 ) voici la démarche :
@echo off
set /a DateConcerne="100509"
set /a M="%DateConcerne:~2,2%"
set /a A=20"%DateConcerne:~0,2%"
if "%DateConcerne:~-2%" == "08" (echo %DateConcerne% %DateConcerne:~-2% %M% %A%)
if "%DateConcerne:~-2%" == "09" (echo %DateConcerne% %DateConcerne:~-2% %M% %A%)
if "%DateConcerne:~-2%" NEQ "09" (set /a J="%DateConcerne:~-2%"&&echo %DateConcerne% %J% %M% %A%)
pause
karirovax
salut
le prb ici sauf pour les deux valeurs 08 et 09
( pour votre cas 100509 )
car la commande SET traite les deux valeurs comme octale et comme les deux ne sont pas valides comme octale alors ils sont réfusés ( 01 , 02 , 03 , ... , 07 )
la petite valeur octale dans cette notation est le numéro 01 et la plus grande est le 07 c pour ca que le 08 et 09 sont réfusé
la ligne qui vous indique ce problème est pour votre variable J :
set /a J=%DateConcerne:~-2%
car elle affiche les deux derniers caractére qui sont 09
karirovax
le prb ici sauf pour les deux valeurs 08 et 09
( pour votre cas 100509 )
car la commande SET traite les deux valeurs comme octale et comme les deux ne sont pas valides comme octale alors ils sont réfusés ( 01 , 02 , 03 , ... , 07 )
la petite valeur octale dans cette notation est le numéro 01 et la plus grande est le 07 c pour ca que le 08 et 09 sont réfusé
la ligne qui vous indique ce problème est pour votre variable J :
set /a J=%DateConcerne:~-2%
car elle affiche les deux derniers caractére qui sont 09
karirovax
Oui, le problème concerne la variable %J% (comme mis en gras précedemment) Merci pour cette explication.
Je ne connait pas la notion de valeurs "octales" (je maitrise mieux les entiers et les réels!).
Par conséquent, j'ai du mal à saisir l'impossibilité pour l'ordinateur à stocker une valeur supérieur à "07", surtout si on considère le fait qu'il est possible de mettre "10", qui est plus grand que "07"...
Bref, en tout cas, et même si la connaissance de la cause est un premier pas, je serais surtout interessé par une solution à mon problème...
Comment faire pour contourner cette limitation à "07" des valeurs octales?
Je ne connait pas la notion de valeurs "octales" (je maitrise mieux les entiers et les réels!).
Par conséquent, j'ai du mal à saisir l'impossibilité pour l'ordinateur à stocker une valeur supérieur à "07", surtout si on considère le fait qu'il est possible de mettre "10", qui est plus grand que "07"...
Bref, en tout cas, et même si la connaissance de la cause est un premier pas, je serais surtout interessé par une solution à mon problème...
Comment faire pour contourner cette limitation à "07" des valeurs octales?
Re,
non
le 10 en décimal égal au 12 en octal
c pas comme vous dites 10 est grand que le 07 non
par Ex : dans le PC ( language machine ) il traite seulement les valeurs binaires ( 0 et 1 )
si on ecrit 11 en binaire ce n'est pas le nombre anze !! c la valeur 4 en décimale
donc il n'exsiste pas le 2 ou 3 ou 4 ... etc dans les valeurs binaires et ceci ne dit pas qu'on ne paut pas l'ecrire dans une autre base " il ya décimale ( 0 , 1 , 2 , .. 10 ) connaitre pour tout le monde depuis l'ecole primere " " l'héxadécimal ( 0 , 1 , ... , 9 , A , B , C , D , E , F )
" octal ( 0, 1 , 2 , ... , 8 ) "
non
le 10 en décimal égal au 12 en octal
c pas comme vous dites 10 est grand que le 07 non
par Ex : dans le PC ( language machine ) il traite seulement les valeurs binaires ( 0 et 1 )
si on ecrit 11 en binaire ce n'est pas le nombre anze !! c la valeur 4 en décimale
donc il n'exsiste pas le 2 ou 3 ou 4 ... etc dans les valeurs binaires et ceci ne dit pas qu'on ne paut pas l'ecrire dans une autre base " il ya décimale ( 0 , 1 , 2 , .. 10 ) connaitre pour tout le monde depuis l'ecole primere " " l'héxadécimal ( 0 , 1 , ... , 9 , A , B , C , D , E , F )
" octal ( 0, 1 , 2 , ... , 8 ) "
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci pour cette réponse rapide!
Oui, je sais que le PC traite les données en binaire (base 2).
Je sais aussi ce qu'est un chiffre Hexadécimale (base 16 - de 0 à f).
Mais là encore, sa ne solutionne pas mon problème!
Comment récupérer mes deux derniers caractère dans ma variable, en type entier (décimale - base 10!)?!?
Oui, je sais que le PC traite les données en binaire (base 2).
Je sais aussi ce qu'est un chiffre Hexadécimale (base 16 - de 0 à f).
Mais là encore, sa ne solutionne pas mon problème!
Comment récupérer mes deux derniers caractère dans ma variable, en type entier (décimale - base 10!)?!?
Mais pas du tout! Je suis très content de partager mon problème avec toi...
Bon cette solution permet en effet de régler le problème de l'affichage mais je n'ai poster que la partie du code à problème car en fait, je dois absolument ranger ce résultat dans une variable pour ensuite l'utiliser dans un savant calcul...
que pense tu d'écrire quelque chose comme:
set /a DateConcerne="100509"
set /a M="%DateConcerne:~2,2%"
set /a A=20"%DateConcerne:~0,2%"
if "%DateConcerne:~-2%" == "08" (set /a J=8)
if "%DateConcerne:~-2%" == "09" (set /a J=9)
if "%DateConcerne:~-2%" NEQ "09" (set /a J="%DateConcerne:~-2%")
echo %DateConcerne% %J% %M% %A%
pause
Bon cette solution permet en effet de régler le problème de l'affichage mais je n'ai poster que la partie du code à problème car en fait, je dois absolument ranger ce résultat dans une variable pour ensuite l'utiliser dans un savant calcul...
que pense tu d'écrire quelque chose comme:
set /a DateConcerne="100509"
set /a M="%DateConcerne:~2,2%"
set /a A=20"%DateConcerne:~0,2%"
if "%DateConcerne:~-2%" == "08" (set /a J=8)
if "%DateConcerne:~-2%" == "09" (set /a J=9)
if "%DateConcerne:~-2%" NEQ "09" (set /a J="%DateConcerne:~-2%")
echo %DateConcerne% %J% %M% %A%
pause
Je test sa demain car c'est pour mon boulot et la... je suis chez moi!
En tout cas, merci pour ton aide!
Dès que sa marche, je met le sujet en résolut!
Bonne continuation!
En tout cas, merci pour ton aide!
Dès que sa marche, je met le sujet en résolut!
Bonne continuation!
Salut, petit déterrage de post car j'ai rencontré le même problème.
Mon script à moi fait un test sur la date de plusieurs fichiers (grace à une boucle) et je travaille avec des variable délayée de type !variable!.
Je découpe la date pour mettre les années dans !yy! les mois dans !mm! et les jours dans !jj!
puis ensuite je fais un calcul, afin de faire une comparaison (calcul) plus tard, pour le mettre dans une variable comme cela : set /a var=!jj!+31+!var2!+184
Grâce à vos posts je me suis en effet rendu compte que seuls les fichiers donnants jj=08 ou jj=09 posaient problème. J'ai alors réglé mon problème en définissant les variables suivantes au début de ma boucle :
if jj=08 set jj=8
if jj=09 set jj=9
Ca a marché du premier coup :D merci !!
Mon script à moi fait un test sur la date de plusieurs fichiers (grace à une boucle) et je travaille avec des variable délayée de type !variable!.
Je découpe la date pour mettre les années dans !yy! les mois dans !mm! et les jours dans !jj!
puis ensuite je fais un calcul, afin de faire une comparaison (calcul) plus tard, pour le mettre dans une variable comme cela : set /a var=!jj!+31+!var2!+184
Grâce à vos posts je me suis en effet rendu compte que seuls les fichiers donnants jj=08 ou jj=09 posaient problème. J'ai alors réglé mon problème en définissant les variables suivantes au début de ma boucle :
if jj=08 set jj=8
if jj=09 set jj=9
Ca a marché du premier coup :D merci !!
Voici d'ailleurs le code final:
Ce code fonctionne parfaitement et à tout les coups. Il résout le problème de la valeur octal expliqué par karirovax et permet l'utilisation ultérieure des variables pour faire des calculs.
Merci donc à dubcek et à karirovax pour leurs contributions et explications qui ont permis de résoudre mon problème!
donc félicitation à vous
et pour dubcek j'ai pensé que Fonx2 a besoin de son code pour lui rediriger vers un autre calcul ( autre fichier batch ou un code plus complex ) mais je trouve que vous avez bien comprendre l'objectif de Fonx2 et beinh merci à vous pour cette meilleure explication ;)
oui exactement , et merci à vous pour votre meilleur réponse ;)