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

Résolu/Fermé
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
-
 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:

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?!!???

7 réponses

Messages postés
18412
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 janvier 2022
5 535
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
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
131
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!
Messages postés
3211
Date d'inscription
dimanche 17 janvier 2010
Statut
Membre
Dernière intervention
22 juin 2016
216
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 ;)
Messages postés
18412
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
26 janvier 2022
5 535
il y a souvent plusieurs méthodes pour un même résultat, chacun peut choisir la plus appropriée.
Messages postés
3211
Date d'inscription
dimanche 17 janvier 2010
Statut
Membre
Dernière intervention
22 juin 2016
216
re, bonjour

oui exactement , et merci à vous pour votre meilleur réponse ;)
Messages postés
3211
Date d'inscription
dimanche 17 janvier 2010
Statut
Membre
Dernière intervention
22 juin 2016
216
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
Messages postés
3211
Date d'inscription
dimanche 17 janvier 2010
Statut
Membre
Dernière intervention
22 juin 2016
216
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
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
131
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?
Messages postés
3211
Date d'inscription
dimanche 17 janvier 2010
Statut
Membre
Dernière intervention
22 juin 2016
216
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 ) "
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
131
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!)?!?
Messages postés
331
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
5 mai 2013
131
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
Messages postés
3211
Date d'inscription
dimanche 17 janvier 2010
Statut
Membre
Dernière intervention
22 juin 2016
216
Re,

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

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