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 :

opération mathématique sur des variables


Sujet :

Scripts/Batch

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut opération mathématique sur des variables
    Bonjour,

    j'ai un petit souci avec un script, il m'est impossible de dans une boucle IF de faire une opération mathématique sur des variables. Je pensais initialement que la faute était du à un espace dans ma variable, mais même en remplaçant par des valeurs en dures, le calcul n'est pas effectuée. J'avoue je sèche un peu, je ne suis pas un cador non plus faut dire

    Voici mon script:
    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
    REM @echo off
    setlocal enabledelayedexpansion
    REM lecture du fichier H:\Sitescope_Licences_Script\Sitescope_server_list.txt pour parser %%A="nom du server", et %%B="lettre du disque ou est installe SIS"
    for /f "tokens=1,2,3 delims=;" %%A in (H:\Sitescope_Licences_Script\Sitescope_server_list_test.txt) Do    (
    REM suppression du precedent rapport
    DEL H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    echo %DATE% >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    ovdeploy -ovrg server -download -file %%B\Sitescope\logs\monitorCount.log -host %%A
    REM echo %%A >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    TYPE "H:\HPOM_DATA\shared\server\installation\incoming\files\monitorCount.log" | findstr Used: >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    set points_buy=%%C
    echo %points_buy%
    REM setlocal enabledelayedexpansion
    for /f "tokens=2 delims=:" %%D in (H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt) Do (
    echo %%D
    rem set points_used=%%D
    rem echo %points_used%
    set /a diff_points=%points_buy%-%%D
    set /a intermediate=%diff_points%/%points_buy%
    set /a percent=%intermediate%*100
    if "%intermediate%" LSS "10" echo NOK_%%A
    )
    )
    Le fichier Sitescope_server_list_test est de la forme:
    PMON1APPV05;D:;4000

    avec en premier le hostname du serveur, ensuite le disque ou est installé l'appli, et enfin le nombre de points de licences acheté.

    Contenu du fichier SIS_POINTS_%%A.txt :
    04/11/2014
    Total Points Used: 3321



    Question subsidiaire, la variable points_used récupère un espace avant le nombre, je voudrais bien parvenir a enlever cet espace, mais je ne sais pas comment faire, jouer sur les délimiteurs me fait matcher un autre bout de la phrase... bref, un avis d'expert ne serait pas de refus

    Merci a vous tous

  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
    Points : 3 768
    Points
    3 768
    Par défaut
    Essaye comme-ç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
    21
    22
    REM @echo off
    setlocal enabledelayedexpansion
    REM lecture du fichier H:\Sitescope_Licences_Script\Sitescope_server_list.txt pour parser %%A="nom du server", et %%B="lettre du disque ou est installe SIS"
    for /f "tokens=1,2,3 delims=;" %%A in (H:\Sitescope_Licences_Script\Sitescope_server_list_test.txt) Do    (
    REM suppression du precedent rapport
    DEL H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    echo %DATE% >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    ovdeploy -ovrg server -download -file %%B\Sitescope\logs\monitorCount.log -host %%A
    REM echo %%A >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    TYPE "H:\HPOM_DATA\shared\server\installation\incoming\files\monitorCount.log" | findstr Used: >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    set points_buy=%%C
    echo !points_buy!
    for /f "skip=1 tokens=2 delims=:" %%D in (H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt) Do (
    echo %%D
    rem set points_used=%%D
    rem echo !points_used!
    set /a diff_points=!points_buy!-%%D
    set /a intermediate=!diff_points!/!points_buy!
    set /a percent=!intermediate!*100
    if "!intermediate!" LSS "10" echo NOK_%%A
    )
    )
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    hello sachadee,

    merci pour ton aide
    J'ai compris que mon script aurait un problème car le Batch ne gère pas les flottant, donc pour un calcul de pourcentage... makache !
    Du coup j'ai modifié mon script pour ne plus en utilisé ce qui donne:

    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
    REM @echo off
    setlocal enabledelayedexpansion
    REM lecture du fichier H:\Sitescope_Licences_Script\Sitescope_server_list.txt pour parser %%A="nom du server", et %%B="lettre du disque ou est installe SIS"
    for /f "tokens=1,2,3 delims=;" %%A in (H:\Sitescope_Licences_Script\Sitescope_server_list_test.txt) Do    (
    REM suppression du precedent rapport
    DEL H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    echo %DATE% >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    ovdeploy -ovrg server -download -file %%B\Sitescope\logs\monitorCount.log -host %%A
    REM echo %%A >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    TYPE "H:\HPOM_DATA\shared\server\installation\incoming\files\monitorCount.log" | findstr Used: >> H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt
    set points_buy=%%C
    echo !points_buy!
    for /f "skip=1 tokens=2 delims=:" %%D in (H:\Sitescope_Licences_Script\SIS_POINTS_%%A.txt) Do (
    echo %%D
    set /a diff_points=!points_buy!-%%D
    echo !diff_points!
    if "!diff_points!" LSS "1000" echo NOK_%%A
    )
    )

    L'output de l'exécution:

    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
    C:\Users\ngreder>(
    REM suppression du precedent rapport
     DEL H:\Sitescope_Licences_Script\SIS_POINTS_PMON1APPV05.txt
     echo 05/11/2014  1>>H:\Sitescope_Licences_Script\SIS_POINTS_PMON1APPV05.txt
     ovdeploy -ovrg server -download -file D:\Sitescope\logs\monitorCount.log -host PMON1APPV05
     REM echo PMON1APPV05 >> H:\Sitescope_Licences_Script\SIS_POINTS_PMON1APPV05.txt
     TYPE "H:\HPOM_DATA\shared\server\installation\incoming\files\monitorCount.log"   | findstr Used:  1>>H:\Sitescope_Licences_Script\SIS
     set points_buy=4000
     echo !points_buy!
     for /F "skip=1 tokens=2 delims=:" %D in (H:\Sitescope_Licences_Script\SIS_POINTS_PMON1APPV05.txt) Do (
    echo %D
     set /a diff_points=!points_buy!-%D
     echo !diff_points!
     if "!diff_points!" LSS "1000" echo NOK_PMON1APPV05
    )
    )
    INFO:    File successfully downloaded.
    4000
    
    C:\Users\ngreder>(
    echo  3321
     set /a diff_points=!points_buy!- 3321
     echo !diff_points!
     if "!diff_points!" LSS "1000" echo NOK_PMON1APPV05
    )
     3321
    679
    Maintenant, je constate que la dernière condition n'est pas évalué, puisque 679 étant plus petit que 1000, l'echo n'est pas joué alors qu'il le devrait...
    J'ai tenté de mettre la valeur de diff_points en dure dans la condition, cela ne fonctionne pas non plus, en fait cela ne marche que si j'utilise le ==, c'est quand même un truc de fou cette histoire!

    En revanche, peux tu m'expliquer le coup des ! pour les variables, je n'avais jamais vu cette syntaxe, utilisant toujours le %, et je ne trouve pas d'explication sur le NET, y a t'il un traitement particulier quand on utilise l'un plutôt que l'autre ?

    Encore merci de ton aide

  4. #4
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    Maintenant, je constate que la dernière condition n'est pas évalué, puisque 679 étant plus petit que 1000, l'echo n'est pas joué alors qu'il le devrait...
    J'ai tenté de mettre la valeur de diff_points en dure dans la condition, cela ne fonctionne pas non plus, en fait cela ne marche que si j'utilise le ==, c'est quand même un truc de fou cette histoire!

    Essaye en retirant les strings du 2eme élement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if "!diff_points!" LSS 1000 echo NOK_%%A
    Vraiment bizarre en effet ça marche jusqu'à 999

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if "!diff_points!" LSS "999" echo NOK_%%A
    Mais à partir de 1000 il faut retirer les strings.


    Pour les ! au lieu des % tu peux les utiliser uniquement lorsque l'expansion retardé et activé et pour des valeurs changeante dans une boucle FOR.

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  5. #5
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    OMG !!!

    je suis traumat deja par le code en général mais là...

    Mais bon ça fonctionne en effet, en contradiction avec tous les manuels "le batch pour les nuls !"

    Bon je suis un tatillon joueur, j'ai donc modifié la valeur qu'ait sensé prendre la variable points_buy, pour tomber sous la barre des 100 qui est ma valeur définitive, et là, o miracle, ca ne fonctionne que si j'enlève les ""... va comprendre charles
    Encore plus joueur, je modifie le seuil a LSS 50, et bah la si je remet pas les "" ça ne marche plus !!!!


    RAAAAAAAAAAAAAAAAA i'm cursed
    Je cherche désormais un outil capable de chasser le poltergeist de ma machine !

    Merci beaucoup en tout cas, cela m'enlève une belle migraine qui traînait ^^

  6. #6
    Membre régulier
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Points : 79
    Points
    79
    Par défaut
    Bon je deviens fou, ca fonctionne pour une entrée, puis pour une autre on ne sait quelle raison ca ne fonctionne plus...

    J'ai pas mal retravailler mon code ce qui donne:
    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
    REM @echo off
    setlocal enabledelayedexpansion
    
    set server_list=H:\Sitescope_Licences_Script\Sitescope_server_list_test.txt
    
    REM lecture du fichier H:\Sitescope_Licences_Script\Sitescope_server_list.txt pour parser %%A="nom du server", et %%B="lettre du disque ou est installe SIS"
    for /f "tokens=1,2,3 delims=;" %%A in (%server_list%) Do    (
    set server=%%A
    set disk=%%B
    set points_buy=%%C
    
    REM suppression du precedent rapport
    call :Delete
    call :Timestamp
    call :File_DL
    call :Lic_use
    call :Calcul
    )
    
    :File_DL
    ovdeploy -ovrg server -download -file %disk%\Sitescope\logs\monitorCount.log -host %server%
    GOTO :EOF
    
    :Calcul
    for /f "skip=1 tokens=2 delims=:" %%D in (H:\Sitescope_Licences_Script\SIS_POINTS_%server%.txt) Do (
    set points_used=%%D
    set /a diff_points=!points_buy!-!points_used!
    echo !diff_points!
    if "!diff_points!" LSS "200" echo NOK_!server! >> H:\Sitescope_Licences_Script\SIS_POINTS_result.txt
    )
    GOTO :EOF
    
    :Delete
    DEL H:\Sitescope_Licences_Script\SIS_POINTS_%server%.txt
    GOTO :EOF
    
    :Timestamp
    echo %DATE% >> H:\Sitescope_Licences_Script\SIS_POINTS_%server%.txt
    GOTO :EOF
    
    :Lic_use
    TYPE "H:\HPOM_DATA\shared\server\installation\incoming\files\monitorCount.log" | findstr Used: >> H:\Sitescope_Licences_Script\SIS_POINTS_%server%.txt
    GOTO :EOF

    Server_list:
    FRJCDSWSUPV64;D:;5000

    Output:
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    C:\Users\ngreder.AD-ONE>REM @echo off
    
    C:\Users\ngreder.AD-ONE>setlocal enabledelayedexpansion
    
    C:\Users\ngreder.AD-ONE>set server_list=H:\Sitescope_Licences_Script\Sitescope_server_list_test.txt
    
    C:\Users\ngreder.AD-ONE>REM lecture du fichier H:\Sitescope_Licences_Script\Sitescope_server_list.txt pour parser %A="nom du server", et %B="lettre du disque ou
     est installe SIS"
    
    C:\Users\ngreder.AD-ONE>for /F "tokens=1,2,3 delims=;" %A in (H:\Sitescope_Licences_Script\Sitescope_server_list_test.txt) Do (
    set server=%A
     set disk=%B
     set points_buy=%C
     REM suppression du precedent rapport
     call :Delete
     call :Timestamp
     call :File_DL
     call :Lic_use
     call :Calcul
    )
    
    C:\Users\ngreder.AD-ONE>(
    set server=FRJCDSWSUPV64
     set disk=D:
     set points_buy=5000
     REM suppression du precedent rapport
     call :Delete
     call :Timestamp
     call :File_DL
     call :Lic_use
     call :Calcul
    )
    
    C:\Users\ngreder.AD-ONE>DEL H:\Sitescope_Licences_Script\SIS_POINTS_FRJCDSWSUPV64.txt
    
    C:\Users\ngreder.AD-ONE>GOTO :EOF
    
    C:\Users\ngreder.AD-ONE>echo 10/11/2014  1>>H:\Sitescope_Licences_Script\SIS_POINTS_FRJCDSWSUPV64.txt
    
    C:\Users\ngreder.AD-ONE>GOTO :EOF
    
    C:\Users\ngreder.AD-ONE>ovdeploy -ovrg server -download -file D:\Sitescope\logs\monitorCount.log -host FRJCDSWSUPV64
    INFO:    File successfully downloaded.
    
    C:\Users\ngreder.AD-ONE>GOTO :EOF
    
    C:\Users\ngreder.AD-ONE>TYPE "H:\HPOM_DATA\shared\server\installation\incoming\files\monitorCount.log"   | findstr Used:  1>>H:\Sitescope_Licences_Script\SIS_PO
    INTS_FRJCDSWSUPV64.txt
    
    C:\Users\ngreder.AD-ONE>GOTO :EOF
    
    C:\Users\ngreder.AD-ONE>for /F "skip=1 tokens=2 delims=:" %D in (H:\Sitescope_Licences_Script\SIS_POINTS_FRJCDSWSUPV64.txt) Do (
    set points_used=%D
     set /a diff_points=!points_buy!-!points_used!
     echo !diff_points!
     if "!diff_points!" LSS 200 echo NOK_!server!
     rem  >> H:\Sitescope_Licences_Script\SIS_POINTS_result.txt
    )
    
    C:\Users\ngreder.AD-ONE>(
    set points_used= 3793
     set /a diff_points=!points_buy!-!points_used!
     echo !diff_points!
     if "!diff_points!" LSS "200" echo NOK_!server!
     rem  >> H:\Sitescope_Licences_Script\SIS_POINTS_result.txt
    )
    1207
    NOK_FRJCDSWSUPV64
    
    C:\Users\ngreder.AD-ONE>GOTO :EOF
    
    C:\Users\ngreder.AD-ONE>ovdeploy -ovrg server -download -file D:\Sitescope\logs\monitorCount.log -host FRJCDSWSUPV64
    INFO:    File successfully downloaded.
    
    C:\Users\ngreder.AD-ONE>GOTO :EOF

    En fait, après analyse, il s'avère que le script part en vrille si les valeurs renvoyés par diff_points sont comprises entre 1000 et 1999. En dessous, ou au dessus, là j'ai bien le résultat attendu.
    Je deviens fou, je ne comprends pas ce que fait le systeme.

Discussions similaires

  1. [SimpleXML] Opérations mathématiques sur des float
    Par CBresso dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 11/05/2012, 13h38
  2. Opération sur des variables
    Par rollergirl dans le forum Langage
    Réponses: 8
    Dernier message: 16/08/2010, 19h11
  3. Réponses: 4
    Dernier message: 19/02/2006, 18h18
  4. [time]Opération mathématique sur heure
    Par Shaika-Dzari dans le forum Général Python
    Réponses: 4
    Dernier message: 28/12/2005, 19h08
  5. Réponses: 4
    Dernier message: 15/12/2002, 04h19

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