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

VBScript Discussion :

Intercepter les erreurs cmd dans un vbs


Sujet :

VBScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 30
    Points : 24
    Points
    24
    Par défaut Intercepter les erreurs cmd dans un vbs
    Bonjour à tous,

    Est-il possible de récupérer l'erreur d'un cmd lorsque je lance des commandes dos dans un vbs ?

    Comme exemple j’ai un programme blabla.exe qui n’existe pas, le script vbs ne retourne aucune erreur. (ce n'est pas normal...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option explicit
    On error goto 0
    Dim objShell
     
    Set objShell = CreateObject("Wscript.Shell")
    objShell.Run "%comspec% /c blabla.exe", 0, True
    wscript.echo "erreur  : " & Err.number
    Avez-vous une solution pour intercepter les codes de retour différent de 0 dans un cmd ?

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Quand tu mets "On Error Goto 0" tu n'auras pas de message d'erreur.
    De plus, l'exécution de cmd avec le commutateur /C a pour effet de fermer la fenêtre DOS sans te laisser le temps de voir l'erreur.
    Enfin, il faut faire le test sur l'existence du fichier que tu appelles "blabla.exe"
    Voici un bout de code pour le test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim objShell,fso, NoError
    'On error goto 0
    set fso=CreateObject("Scripting.FileSystemObject")
    NoError=fso.FileExists("Blabla.exe")
    Set objShell = CreateObject("Wscript.Shell")
    objShell.Run "%comspec% /k blabla.exe", 1, True
    msgbox NoError '"erreur  : " & Err.number
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Tu peux récupérer les erreurs d'un programme lancé un vbscript ainsi que le StdOut et le StdErr.
    Regarde ces exemples de code (fonctions utiles) :
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    '--------------------------------------------------------------------------
    ' Convert to unicode.
    ' For french language (for example), the text returned by ExecCommandShell
    ' should be converted to unicode with correct code page to be correct (with accent).
    '
    ' Parameters :
    '-------------
    '   strTextToConvert : Text to convert to unicode
    '
    ' Return :
    '---------
    '   The text converted into unicode string.
    '
    '--------------------------------------------------------------------------
    Function ConvertToUnicode(strTextToConvert)
        ConvertToUnicode=g_objConv.ToUnicode(strTextToConvert,g_CodePage)
    End Function
     
    ' Converter to Unicode (global variable) - Initialisation
    Dim g_objConv,g_CodePage
    InitCodePage() ' Initialize converter to unicode (make only once)
    Sub InitCodePage()
        Set g_objConv=CreateObject("OlePrn.OleCvt")     ' Converter
        g_CodePage=Split(CreateObject("WScript.Shell").Exec("cmd /c chcp").StdOut.ReadAll,":")(1) ' Get Code Page
    End Sub
     
    '--------------------------------------------------------------------------
    ' Execute a shell command.
    ' Wait the end of command and get the stdout / stderr output.
    '
    ' Parameters :
    '-------------
    '   strCommand  : Commande to execute
    '   objShell    : Shell created with CreateObject("WScript.Shell")
    '   strStdOut   : String that will receive Std Out output. If Null, this parameter is ignored.
    '   strStdErr   : String that will receive Std Err output. If Null, this parameter is ignored.
    '
    ' Return :
    '---------
    '   The return value of executed program (generally 0 if all is good).
    '
    '--------------------------------------------------------------------------
    Function ExecCommandShell(strCommand,objShell,strStdOut,strStdErr)
        Dim objExec     ' Objet permettant de contrôler l'exécution
     
        ' Initialiser le StdOut à chaîne vide
        If VarType(strStdOut)=vbString Then
            strStdOut = ""
        End If
     
        ' Initialiser le StdErr à chaîne vide
        If VarType(strStdErr)=vbString Then
            strStdErr = ""
        End If
     
        strCommand = strCommand
        On Error Resume Next
        Set objExec = objShell.Exec(strCommand) ' objExec est de type WshScriptExec
        If Err.Number <> 0 Then
            ' Si la commande n'a pas pu être lancée
            ExecCommandShell = Err.Number
            If VarType(strStdErr)=vbString Then
                strStdErr   = Err.Description
            End If
            On Error Goto 0
            Call Err.Clear()
        Else
            On Error Goto 0
            Dim iStatus
            Do
                Call WScript.Sleep(10)   ' Attendre la fin
     
                iStatus = objExec.Status
                If VarType(strStdOut)=vbString And Not objExec.StdOut.AtEndOfStream Then
                    ' Lire la sortie standard
                    strStdOut = strStdOut & objExec.StdOut.ReadAll
                End If
                If VarType(strStdErr)=vbString And Not objExec.StdErr.AtEndOfStream Then
                    ' Lire la sortie d'erreur
                    strStdErr = strStdErr & objExec.StdErr.ReadAll
                End If
            Loop While iStatus = 0   ' => Vaut 1 quand terminé, 0 indique qu'il est en cours
     
            ExecCommandShell = objExec.ExitCode
        End If
     
        ' Convert to unicode
        If VarType(strStdOut)=vbString Then
            strStdOut = ConvertToUnicode(strStdOut)
        End If
     
        ' Convert to unicode
        If VarType(strStdErr)=vbString Then
            strStdErr = ConvertToUnicode(strStdErr)
        End If
     
        Set objExec    = Nothing
    End Function
     
    '--------------------------------------------------------------------------
    ' Exécuter une commande.
    ' Permet d'attendre la fin de la commande et de récupérer en sortie
    ' le StdErr.
    '
    ' Paramètres :
    '-------------
    '   strCommand  : Commande à exécuter
    '   strStdOut   : Chaine de caractère qui va recevoir le Std Out, si vaut Null, ce paramètre est ignoré
    '   strStdErr   : Chaine de caractère qui va recevoir le Std Erreur, si vaut Null, ce paramètre est ignoré
    '
    ' Retour :
    '---------
    '   La valeur de retour de l'exécution du programme (0 en général si
    '   tout s'est bien passé)
    '
    '--------------------------------------------------------------------------
    Function ExecCommand(strCommand,strStdOut,strStdErr)
        ExecCommand = ExecCommandShell(strCommand,CreateObject("WScript.Shell"),strStdOut,strStdErr)
    End Function

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Merci pour le code , c'est tout à fait ce que je cherche.

    Est-il possible d'avoir un exemple de l'appel à la fonction
    Function ExecCommand(strCommand,strStdOut,strStdErr)

    par exemple pour strCommand = "cmd /c dir /blabla"

    Merci.

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par fleurparis Voir le message
    ....
    par exemple pour strCommand = "cmd /c dir /blabla"
    ....
    évite des balbla ... essai de mettre des commandes plus réaliste la commade dir n'as pas d'option /blabla..;

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    comme exemple je pendrais "cmd /c dir z:"

    sachant que je n'ai pas de lecteur z:, je devrais avoir une erreur du genre

    "Le chemin d'accès spécifié est introuvable."


    L'important étant de récupérer le code de sortie "cmd /c dir z:"

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Par exemple rajoute a la fin du code..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim stCde,stOut,stErr
     Dim Ret
     stcde="cmd /c dir z:" 
     stOut=""
     stErr=""
     
     ret=ExecCommand(stCde,stOut,stErr)
     
     msgbox "ret : " & ret & vbcrlf & "Out = " & stOut & vbCrlf & "Err = " & stErr

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Merci cela a résolu mon problème de remonter d'erreur sur un script exécuté localement.

    Auriez-vous une solution pour remonter les erreurs sur un script vbs lancer sur un serveur distant ?

  9. #9
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Merci bbil et désolé fleurparis je n'avais pas vu que tu m'avais posé une question...
    Rien à dire de plus, bbil a bien répondu.

Discussions similaires

  1. Intercepter les erreurs dans un vbs
    Par fleurparis dans le forum VBScript
    Réponses: 1
    Dernier message: 17/10/2010, 22h50
  2. intercepter les erreurs
    Par agrotic dans le forum ASP
    Réponses: 2
    Dernier message: 15/02/2008, 14h03
  3. Intercepter les erreurs d'une commande ?
    Par Olivier Regnier dans le forum Linux
    Réponses: 2
    Dernier message: 01/12/2006, 12h28
  4. intercepter les messages clavier dans un CDialog
    Par firejocker dans le forum MFC
    Réponses: 3
    Dernier message: 26/12/2005, 11h14
  5. récupérer les erreurs php dans des exceptions
    Par jeanvincent dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2005, 16h26

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