BATCH - Séparer les caractères d'une variable

Résolu/Fermé
Fonx2 Messages postés 331 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 5 mai 2013 - 17 mai 2010 à 17:12
 T0MuX - 20 juil. 2016 à 09:24
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:

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:

7 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
18 mai 2010 à 07:53
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
2
Fonx2 Messages postés 331 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 5 mai 2013 132
Modifié par Fonx2 le 18/05/2010 à 09:24
Merci beaucoup pour cette contribution qui m'a été très utile!
Voici d'ailleurs le code final:

set DateConcerne=100509
set J=%DateConcerne:~4,2%  
set /a J=1%J%-100  
set M=%DateConcerne:~2,2%  
set /a M=1%M%-100  
set A=20%DateConcerne:~0,2%  
echo %DateConcerne% %J% %M% %A%  
pause


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!
0
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
20 mai 2010 à 20:37
Re, bonjour
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 ;)
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
21 mai 2010 à 07:27
il y a souvent plusieurs méthodes pour un même résultat, chacun peut choisir la plus appropriée.
0
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
23 mai 2010 à 20:07
re, bonjour

oui exactement , et merci à vous pour votre meilleur réponse ;)
0
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
17 mai 2010 à 22:08
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
1
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
17 mai 2010 à 21:02
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
0
Fonx2 Messages postés 331 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 5 mai 2013 132
Modifié par Fonx2 le 17/05/2010 à 21:16
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?
0
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
17 mai 2010 à 21:25
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 ) "
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Fonx2 Messages postés 331 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 5 mai 2013 132
17 mai 2010 à 21:31
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!)?!?
0
Fonx2 Messages postés 331 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 5 mai 2013 132
Modifié par Fonx2 le 17/05/2010 à 22:20
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
0
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
17 mai 2010 à 22:29
Re,

donc je trouve que c bon pour votre code ;)
0
Fonx2 Messages postés 331 Date d'inscription dimanche 6 avril 2008 Statut Membre Dernière intervention 5 mai 2013 132
17 mai 2010 à 22:33
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!
0
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
17 mai 2010 à 22:39
Re, de rien

s'il ya des nouveaux pour demain ... je suis ici ;)
0
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 !!
0