Plusieurs commande dans un shell est ce possible?

Résolu
fred2567 Messages postés 42 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 31 janvier 2008 - 5 déc. 2007 à 09:02
fred2567 Messages postés 42 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 31 janvier 2008 - 5 déc. 2007 à 12:54
Bonjour,

donc voila j'ai une application en vba qui permet de gérer l'adressage ip de la machine,
or lorsque j'utilise mes commandes avec shell j'ai l'impression que la première finie les  autres ne sont pas prises en comptes
donc j'ailmerai passer plusieurs commandes dans un shell .

est ce possible et si oui comment ?

8 réponses

fred2567 Messages postés 42 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 31 janvier 2008
5 déc. 2007 à 12:54
bon j'ai trouvé un code simple pour exécuter les commandes shell les unes après les autres :

Sub

ShellAndWait(
ByVal action
As
String)

Dim wshShellwshShell = CreateObject(

"WScript.Shell")wshShell.Run(action, 0,

True)MsgBox(

"Fin")wshShell =

Nothing

End
Sub

la variable action est une chaine de caractère ou l'on retrouve ma commande ex : netsh interface ip set DNS name="maconnexion" source=dhcp"
3
pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 octobre 2010 5
5 déc. 2007 à 09:42
salut
tu exécutes la commande Shell c'est bien cela ?
le pb de cette commande c'est qu'elle va rendre la main à l'application appellante aussitot, sans attendre la fin de l'exécution
ce qui fait que tes commandes suivantes vont être lancées aussitot.
donc si elles ont besoin des éléments du résultat de la premiere instruction, il se peut que celle ci ne soit pas terminée donc on a l'impression qu'elles ne se font pas.
ex :
si je fais
shell ("Dir C:\*.* /s > c:\result.txt")
Shell ("Copy C:\result.txt c:\savresult.txt")

les 2 instructions vont être exécutées à la suite... la seconde (qui dépend du résultat de la premiere) va être exécutée alors que la premiere n'est peut être pas terminée.

par contre, tu ne vas pas pouvoir mettre les 2 instructions ensemble dans le shell.
le mieux est de lancer tes commandes shell avec la fonction suivante... (par contre, je ne l'ai pas testée en VBA)
Public Type STARTUPINFO
   cb As Long
   lpReserved As String
   lpDesktop As String
   lpTitle As String
   dwX As Long
   dwY As Long
   dwXSize As Long
   dwYSize As Long
   dwXCountChars As Long
   dwYCountChars As Long
   dwFillAttribute As Long
   dwFlags As Long
   wShowWindow As Integer
   cbReserved2 As Integer
   lpReserved2 As Long
   hStdInput As Long
   hStdOutput As Long
   hStdError As Long
End Type
     
Public Type PROCESS_INFORMATION
   hProcess As Long
   hThread As Long
   dwProcessID As Long
   dwThreadID As Long
End Type


Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const INFINITE = -1&
Public Const CREATE_NO_WINDOW = &H8000000

Public Declare Function WaitForSingleObject Lib "KERNEL32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcessA Lib "KERNEL32" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Public Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long
Public Declare Function GetExitCodeProcess Lib "KERNEL32" (ByVal hProcess As Long, lpExitCode As Long) As Long

Public Function ExecCmd(CmdLine As String) As Long
Dim lretour As Long
   'Procédure qui permet de lancer une commande (équivalent au shell)
   'mais ne rend la main que lorsque cette commande est terminée
   Dim proc As PROCESS_INFORMATION
   Dim start As STARTUPINFO
   Dim ReturnValue As Integer
   ' Initialisation
   start.cb = Len(start)
   ' Lancement de la commande
   ReturnValue = CreateProcessA(vbNullString, CmdLine, 0, 0, 1, NORMAL_PRIORITY_CLASS + CREATE_NO_WINDOW, 0, vbNullString, start, proc)
   ' Attente que l'exécution de la commande se termine
   'Do
      ReturnValue = WaitForSingleObject(proc.hProcess, INFINITE)
   '   DoEvents
   'Loop Until ReturnValue <> 258
   lretour = GetExitCodeProcess(proc.hProcess, lCodeRetour)
   ReturnValue = CloseHandle(proc.hProcess)
   ExecCmd = lCodeRetour
End Function

en espérant t'avoir aidé un peu...
cordialement

Pat

 Don't Worry , Be Happy





<hr />
lorsque le problème est résolu, pensez Réponse Acceptée
0
fred2567 Messages postés 42 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 31 janvier 2008
5 déc. 2007 à 11:07
J'ai pas pu le tester pour l'instant et j'ai une question concernant la variable lcoderetour qui n'es pas déclarée ni incrémenté
peut tu m'éclairer?
0
fred2567 Messages postés 42 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 31 janvier 2008
5 déc. 2007 à 11:09
ok le pb doit venir que tu ai traduit returnvalue en lcoderetour non?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 octobre 2010 5
5 déc. 2007 à 11:17
excuses, j'ai fait un copié collé sans tout prendre dans mon code...

NOn, returnValue contient la valeur de résultat de la fonction exécutée
lcoderetour permet de récupérer le code de sortie de l'application appellée.
si tu n'attends aucun code de sortie particulier, tu n'en n'as pas besoin.
n'hésites pas si besoin...
@+
Pat
0
fred2567 Messages postés 42 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 31 janvier 2008
5 déc. 2007 à 11:18
De plus la variable start n'as pas de valeur au lancement de la fonction
0
fred2567 Messages postés 42 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 31 janvier 2008
5 déc. 2007 à 11:53
Peut tu me redonner le code en complet?
0
pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 octobre 2010 5
5 déc. 2007 à 12:02
tu l'as....
normalement il y a tout...
mais bon tu peux aussi prendre ce code chez MS...
http://support.microsoft.com/kb/129796

@+
Pat
0
Rejoignez-nous