OVH Cloud OVH Cloud

code retour d'une commande DOS lancée par VBA

3 réponses
Avatar
bob
Bonjour,

j'ai un fichier .bat que je voudrai lancer à partir d'une macro VBA.
J'utilise la commande :

codeRetour = shell("chemin_fichier_bat",1)

voilà le contenu de mon fichier bat :

***********************************
echo off
sqlplus -s user/pass@BASE @C:\temp\test.sql

if not ErrorLevel 0 goto :Erreur

:Erreur
echo Erreur numero %ErrorLevel%
exit %ErrorLevel%
***************************************

Je voudrai récupérer la valeur de ErrorLevel. J'ai fait en sorte d'avoir un
ErrorLevel = 942 par exemple, mais ma variable codeRetour me sort à chaque
appel une valeur aléatoire qui ne correspond pas du tout à ce que je veux.

Y a-t-il une erreur de syntaxe dans mon fichier .bat ou dans la commande de
la macro?

Merci de votre aide

3 réponses

Avatar
michdenis
Bonjour Bob,

En dos cela peut être difficile... voici une alternative :

A ) J'ai modifié ton batchFile un peu ... la dernière ligne de code

echo Erreur numero %ErrorLevel% > c:erreur.txt

Et j'ai une procédure pour excécuter le code du batchfile et récupérer l'erreur

1 - Le batchfile créé un fichier de sortie où il enregistre l'erreur erreur.txt
2 - La procédure récupère la donnée du fichier erreur.txt
3 - Ce fichier temporaire est détruit .

'------------------------------
Sub RécuupérerErreurBatchFile()

Dim Chemin As String
Chemin = "c:"

A = Shell(Chemin & "letest.bat", 1)

Open Chemin & "erreur.txt" For Input As #1
Input #1, erreur
Close #1
Kill Chemin & "Erreur.txt"
MsgBox erreur

End Sub
'------------------------------


Salutations!



"bob" a écrit dans le message de news:c9ps39$rct$
Bonjour,

j'ai un fichier .bat que je voudrai lancer à partir d'une macro VBA.
J'utilise la commande :

codeRetour = shell("chemin_fichier_bat",1)

voilà le contenu de mon fichier bat :

***********************************
echo off
sqlplus -s user/ @C:temptest.sql

if not ErrorLevel 0 goto :Erreur

:Erreur
echo Erreur numero %ErrorLevel%
exit %ErrorLevel%
***************************************

Je voudrai récupérer la valeur de ErrorLevel. J'ai fait en sorte d'avoir un
ErrorLevel = 942 par exemple, mais ma variable codeRetour me sort à chaque
appel une valeur aléatoire qui ne correspond pas du tout à ce que je veux.

Y a-t-il une erreur de syntaxe dans mon fichier .bat ou dans la commande de
la macro?

Merci de votre aide
Avatar
Modeste
Bonsour(®),
De mémoire même déja sous DOS le errorlevel est
difficilement exploitable hors du fichier Bat.

ne pas oublier non plus que VBA et Dos sont asynchrones,
prévoir une boucle avant la poursuite de la macro.

Le coderetour qui est récupéré de la commande Shell est
en fait "je pense" ??? le N° de tache Windows et non un
code erreur.(même sans erreur, ce code change à chaque
éxécution)

une solution est de générer un fichier secondaire qui
contient le code erreurlevel ou compte-rendu d'exécution,
puis agir en conséquence.

une autre solution serait d'utiliser une API ShellExécute
qui permet l'envoi d'un code retour.

@+

'--------------------------------------------
ShellExecute permet d'exécuter une application à partir
de l'extension d'un fichier associé. Par exemple, lancer
Paintbrush à partir d'un fichier BMP, Excel à partir d'un
fichier XLS, ou le browser par défaut à partir d'un
fichier HTM.

Declare Function ShellExecute Lib "shell32.dll"
Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpszOp As String, _
ByVal lpszFile As String, ByVal lpszParams As String, _
ByVal lpszDir As String, ByVal fsShowCmd As Long) _
As Long

hwnd : Identificateur de fenêtre parent.
lpszOp : Opération à effectuer open ou print.
lpszFile : Fichier à ouvrir.
lpszParams : Paramètres de l'application lorsque lpszFile
spécifie une application exécutable.
lpszDir : Répertoire par défaut.
fsShowCmd : Mode d'ouverture de la fenêtre d'application.

ShellExecute analyse la chaîne lpszFile pour déterminer
s'il s'agit d'un fichier ou d'une application. Dans le
cas d'un fichier, l'application est déterminée par une
recherche dans la base de registre. Dans le cas d'une
page html, la chaîne "http://" permet d'identifier le
protocole HTTP, ce qui provoque la lecture de la
clé "HKCRhttpshellopen" afin d'identifier le browser
défini par défaut.


Mise en oeuvre


Const SE_ERR_FNF = 2&
Const SE_ERR_PNF = 3&
Const SE_ERR_ACCESSDENIED = 5&
Const SE_ERR_OOM = 8&
Const SE_ERR_DLLNOTFOUND = 32&
Const SE_ERR_SHARE = 26&
Const SE_ERR_ASSOCINCOMPLETE = 27&
Const SE_ERR_DDETIMEOUT = 28&
Const SE_ERR_DDEFAIL = 29&
Const SE_ERR_DDEBUSY = 30&
Const SE_ERR_NOASSOC = 31&
Const ERROR_BAD_FORMAT = 11&

Const SW_SHOWNORMAL = 1

Public Sub StartDoc(ByVal szDoc As String)
Dim lRet As Long, sMessage As String
Dim lErrNum As Long

lRet = ShellExecute(0, "Open", szDoc, _
"", "C:", SW_SHOWNORMAL)

If lRet <= 32 Then
lErrNum = 4000 + lRet Select Case lRet
Case SE_ERR_FNF
Err.Raise lErrNum, "File not found"
Case SE_ERR_PNF
Err.Raise lErrNum, "Path not found"
Case SE_ERR_ACCESSDENIED
Err.Raise lErrNum, "Access denied"
Case SE_ERR_OOM
Err.Raise lErrNum, "Out of memory"
Case SE_ERR_DLLNOTFOUND
Err.Raise lErrNum, "DLL not found"
Case SE_ERR_SHARE
Err.Raise lErrNum, "A sharing violation
occurred"
Case SE_ERR_ASSOCINCOMPLETE
Err.Raise lErrNum, "Incomplete or invalid file
association"
Case SE_ERR_DDETIMEOUT
Err.Raise lErrNum, "DDE Time out"
Case SE_ERR_DDEFAIL
Err.Raise lErrNum, "DDE transaction failed"
Case SE_ERR_DDEBUSY
Err.Raise lErrNum, "DDE busy"
Case SE_ERR_NOASSOC
Err.Raise lErrNum, "No association for file
extension"
Case ERROR_BAD_FORMAT
Err.Raise lErrNum, "Invalid EXE file or error
in EXE image"
Case Else
Err.Raise lErrNum, "Unknown error"
End Select

End If
End Sub


-----Message d'origine-----
Bonjour,

j'ai un fichier .bat que je voudrai lancer à partir
d'une macro VBA.

J'utilise la commande :

codeRetour = shell("chemin_fichier_bat",1)

voilà le contenu de mon fichier bat :

***********************************
echo off
sqlplus -s user/ @C:temptest.sql

if not ErrorLevel 0 goto :Erreur

:Erreur
echo Erreur numero %ErrorLevel%
exit %ErrorLevel%
***************************************

Je voudrai récupérer la valeur de ErrorLevel. J'ai fait
en sorte d'avoir un

ErrorLevel = 942 par exemple, mais ma variable
codeRetour me sort à chaque

appel une valeur aléatoire qui ne correspond pas du tout
à ce que je veux.


Y a-t-il une erreur de syntaxe dans mon fichier .bat ou
dans la commande de

la macro?

Merci de votre aide



.



Avatar
bob
Super, ça marche et ça me convient parfaitement.

Merci beaucoup


"michdenis" a écrit dans le message news:

Bonjour Bob,

En dos cela peut être difficile... voici une alternative :

A ) J'ai modifié ton batchFile un peu ... la dernière ligne de code

echo Erreur numero %ErrorLevel% > c:erreur.txt

Et j'ai une procédure pour excécuter le code du batchfile et récupérer
l'erreur


1 - Le batchfile créé un fichier de sortie où il enregistre l'erreur
erreur.txt

2 - La procédure récupère la donnée du fichier erreur.txt
3 - Ce fichier temporaire est détruit .

'------------------------------
Sub RécuupérerErreurBatchFile()

Dim Chemin As String
Chemin = "c:"

A = Shell(Chemin & "letest.bat", 1)

Open Chemin & "erreur.txt" For Input As #1
Input #1, erreur
Close #1
Kill Chemin & "Erreur.txt"
MsgBox erreur

End Sub
'------------------------------


Salutations!



"bob" a écrit dans le message de
news:c9ps39$rct$

Bonjour,

j'ai un fichier .bat que je voudrai lancer à partir d'une macro VBA.
J'utilise la commande :

codeRetour = shell("chemin_fichier_bat",1)

voilà le contenu de mon fichier bat :

***********************************
echo off
sqlplus -s user/ @C:temptest.sql

if not ErrorLevel 0 goto :Erreur

:Erreur
echo Erreur numero %ErrorLevel%
exit %ErrorLevel%
***************************************

Je voudrai récupérer la valeur de ErrorLevel. J'ai fait en sorte d'avoir
un

ErrorLevel = 942 par exemple, mais ma variable codeRetour me sort à chaque
appel une valeur aléatoire qui ne correspond pas du tout à ce que je veux.

Y a-t-il une erreur de syntaxe dans mon fichier .bat ou dans la commande
de

la macro?

Merci de votre aide