Même problème...
alors j'ai ajouté un TIMEOUT dans le cmd et dans ce cas la commande s’exécute correctement jusqu’à la fin de l'écriture dans le bios puis passe sur le TIMEOUT .
Comment je peux faire pour le shellexecutewait attende l’exécution complète de la commande ?
Le programme BIOSConfigUtility doit certainement exécuter un ou plusieurs processus enfants. Dans ce cas, il faut attendre que chaque processus enfant soit terminé.
Un exemple :
Après ProcessWaitClose($iPid) je pense que le PID n'existe plus. A ce moment-là, _WinAPI_EnumChildProcess($iPid) ne pourra pas lister les process fils.
Enfin, peut-être que je me gourre...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
#include <WinAPIProc.au3>
Local $iPid = ShellExecute("BIOSConfigUtility.exe", "/setvalue:'Asset Tracking Number','xxxx.xxxx.xx'", "C:\Program Files (x86)\HP\BIOS Configuration Utility\")
$retour = _ProcessWaitCloseRec($iPid)
MsgBox(0,"retour",$retour);erreur 1 sinon 0
Func _ProcessWaitCloseRec($iPid)
Local $bChildProcess
Local $aChildProcess = _WinAPI_EnumChildProcess($iPid) ; On liste les process enfants
If @error Then Return 1
ProcessWaitClose($iPid) ; On attend que le process se termine
For $i = 1 To $aChildProcess[0][0]
$nPid = $aChildProcess[$i][0]
$bChildProcess = _WinAPI_EnumChildProcess($nPid);recherche sous process enfant
If ProcessExists($nPid) Then ProcessWaitClose($nPid) ; Pour chaque process enfant, on fait la même chose
If IsArray($bChildProcess) Then
For $y = 1 To $bChildProcess[0][0]
$nPid = $bChildProcess[$y][0]
If ProcessExists($nPid) Then ProcessWaitClose($nPid) ; Pour chaque sous process enfant
Next
EndIf
Next
Return 0
EndFunc
Il faudra voir aussi le temps de chargement du programme et peut être rajouter après ShellExecute()
Sleep(2000) plus ou moins
$iPid = ProcessExists("BIOSConfigUtility.exe")
Cordialement,
Walkson "Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Autre suggestion #RequireAdmin sous les includes pour avoir les droits administrateur
Et enfin utilisez Run() à la place de ShellExecute() (avec le chemin complet du programme)
Run() fonctionne mieux en ligne de commande
Cordialement,
Walkson "Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Bonjour.
A tester : Lancez le gestionnaire de tâches et regardez ce qui ce passe quand vous lancez l'utilitaire.
Vous allez forcément voir apparaitre/disparaitre des processus.
Utilisez le bon nom de processus pour détecter la fin de celui-ci.