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 :

[commande DOS] Récupérer le code retour d'un programme


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut [commande DOS] Récupérer le code retour d'un programme
    Bonjour,

    je souhaiterai récupérer le code retour renvoyé par un application, en l'occurence SQLplus d'ORACLE.

    mon batch nommé 'test.bat' se présente comme suit
    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
    :begin
    echo off
    sqlplus -s user/pass@DB @test.sql
    if errorlevel 0 goto endlevel0
    if errorlevel 1 goto endlevel1
    if errorlevel 2 goto endlevel2
    if errorlevel 3 goto endlevel3
    
    :endlevel1
    echo erreur level 1
    goto :EOF
    :endlevel2
    echo erreur level 2
    goto :EOF
    :endlevel3
    echo erreur level 3
    goto :EOF
    :endlevel0
    echo erreur level 0
    goto :EOF
    Mon fichier sql, lui est tout simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WHENEVER SQLERROR EXIT SQL.SQLCODE;
    WHENEVER OSERROR  EXIT;
    
    select * from toto where ncntnum = 'XX';
    
    insert into toto(1,2);
    
    exit
    Donc je génère une erreur car la table toto n'existe pas, donc je devrais avoir un code retour correspondant à l'erreur sql.

    Quand j'exécute mon fichier bat, je me trouve toujours dans le bloc
    if errorlevel 0 goto endlevel0
    Est-ce que j'utilise les bonnes commandes ?

    Merci d'avance de votre aide

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    A prioris les commandes DOS semblent correct,mais ajoute ceci en début de script SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    whenever sqlerror exit failure

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    oui car la fin de ton script se termine par "exit" et non pas exit "code_erreur"
    donc le exitfailure devrait faire l'affaire
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Voici une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Whenever sqlerror Exit Failure 
    WHENEVER SQLERROR EXIT SQL.SQLCODE; 
    
    Select * From toto Where ncntnum = 'XX'; 
    Insert Into toto(1,2); 
    Exit
    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
    Echo off 
    sqlplus -s user/pass@DB @test.sql 
    Goto Error%ErrorLevel%
    
    :Error0 
    echo pas d'erreur 
    goto :EOF
    
    :Error1 
    echo erreur level 1 
    goto :EOF 
    
    :Error942
    Echo Erreur numero : %ErrorLevel%
    echo Erreur : Table ou vue inexistante
    goto :EOF

  5. #5
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    Super ça marche.

    Pour aller plus loin j'ai encore 1 ptite question.
    En fait je lance mon fichier test.bat à partir d'une macro VBA, à l'aide de la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_Retour = Shell("chemin_du_fichier.bat",1)
    En fait j'aimerai récupérer le code retour ErrorLevel. J'ai essayé par exemple de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Echo off
    sqlplus -s user/pass@DB @test.sql 
    
    if not ErrorLevel 0 goto :Erreur
    
    :Erreur
    echo Erreur numero %ErrorLevel%
    exit %ErrorLevel%
    goto :EOF
    Mais je récupère toujours une valeur aléatoire pour ma variable var_Retour.

    Y a-t-il un problème dans mon code?

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Sous XP ( Exit /?)
    Sous W2K si cette syntaxe n'existe pas je ne connais pas d'astuce pour le faire.

    Pourquoi ne pas exécuter directement Sqlplus dans la ligne du shell et gérer l'erreur dans le VBA ?

  7. #7
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    J'ai essayé de lander la commande sqlplus directement dans le VBA, mais le code retour que je récupère est toujours aléatoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_Retour = Shell("sqlplus user/pass@base @monfichierSQL",1)
    Avec l'exemple du fichier sql qui me génère une erreur 942 (table qui n'existe pas), mais variable var_Retour prend des valeurs différentes à chaque appel.


  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Le comportement me semble 'normale'
    If the Shell function successfully executes the named file, it returns the task ID of the started program. The task ID is a unique number that identifies the running program. If the Shell function can't start the named program, an error occurs

    Note By default, the Shell function runs other programs asynchronously. This means that a program started with Shell might not finish executing before the statements following the Shell function are executed.
    Et avec l'API CreateProcess, tu as essayer ?

  9. #9
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    Bon j'ai trouvé une alternative :
    dans mon fichier test.bat, je mets la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo Erreur numero %ErrorLevel% > c:\erreur.txt
    Après je traite ce fichier c:\erreur.txt en VBA et le tour est joué.

    Voilà merci encore pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/06/2009, 12h23
  2. Réponses: 4
    Dernier message: 15/05/2008, 11h25
  3. Comment récupérer un code retour SFTP ?
    Par hervé94 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 28/08/2007, 20h45
  4. [2.0]Récupérer un code retour d'un exe.
    Par MoscoBlade dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/04/2007, 16h50

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