OpenProcess Lib "kernel32"
J'utilise ce code pour lancer des batch file sur plusieurs ordinateurs en même temps.
J'explique un peu comment ça marche: j'ai un formulaire avec 5 boutons, chaque bouton lance la fonction avec comme paramètre le nom de la machine. Si je mets chaque bouton dans une form à part, ça fonctionne parfaitement ! L'ennui vient lorsque tous les boutons sont dans le même formulaire (ce qui est plus logique à faire;))
La fonction LireFichier récupère les fichiers texte qui sont crées sur les machines distantes à la fin de l'exécution de chaque batch et lit le text contenu dans le fichier.
Le problème est qu'à la fin du premier batch, il y a un debug qui se fait, les autres ne se font tous qu'en même temps à la fin d'exécution du dernier batch
alors que le besoin de lire le fichier généré juste après la fin de l'exécution du batch en question
Voici le code et merci de votre aide en avance
Code:
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
| Option Compare Database
Option Explicit
Rem declaration des api qui permettent d'attendre la fin de l'execution avant de passer a autre chose
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Private Const SYNCHRONIZE = &H100000
Private Const WAIT_TIMEOUT = &H102&
Function Copy_it(machine_name As String) As String
Dim strmsgbox As String
Dim Démarre, ProcessHandle, retour
Démarre = Shell("C:\" + machine_name + "_batch.bat", vbNormalFocus)
ProcessHandle = OpenProcess(SYNCHRONIZE, False, Démarre)
retour = WaitForSingleObject(ProcessHandle, 1)
Do
retour = WaitForSingleObject(ProcessHandle, 1)
DoEvents
Loop While retour = WAIT_TIMEOUT
retour = CloseHandle(ProcessHandle)
strmsgbox = LireFichier(machine_name)
Copy_it = strmsgbox
Debug.Print Now, machine_name & ": " & Copy_it
End Function
Function LireFichier(machine_name As String) As String
Dim fso As FileSystemObject
Dim fFile As File
Dim ts As TextStream
Dim sPath, result As String
sPath = "\\" & machine_name & "\" & "c$\" & machine_name & "_log.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(sPath) = False Then
Exit Function
End If
Set fFile = fso.GetFile(sPath)
Set ts = fFile.OpenAsTextStream(ForReading)
result = Trim(ts.ReadAll)
ts.Close
Set ts = Nothing
Set fFile = Nothing
Set fso = Nothing
Debug.Print result
LireFichier = result
End Function |