Page 1 sur 1

Shellexecutewait se ferme trop rapidement

Posté : lun. 30 mai 2022 14:25
par atheles
Bonjour à tous,

Je cherche à exécuter cette commande :
ShellExecuteWait("BIOSConfigUtility.exe", "/setvalue:'Asset Tracking Number','xxxx.xxxx.xx'", "C:\Program Files (x86)\HP\BIOS Configuration Utility\")
Cela fonctionne mais la fenêtre d’exécution se ferme avant que le programme ait terminé l'écriture dans le bios.

J'ai essayé ça
RunWait(@ComSpec & " /c " & "hpbios.cmd")
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 ?

Je vous remercie

Re: Shellexecutewait se ferme trop rapidement

Posté : mar. 31 mai 2022 22:27
par jguinch
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 :
#include <WinAPIProc.au3>

Local $iPid = ShellExecute("BIOSConfigUtility.exe", "/setvalue:'Asset Tracking Number','xxxx.xxxx.xx'", "C:\Program Files (x86)\HP\BIOS Configuration Utility\")
_ProcessWaitCloseRec($iPid)

Func _ProcessWaitCloseRec($iPid)
   ProcessWaitClose($iPid) ; On attend que le process se termine
   Local $aChildProcess = _WinAPI_EnumChildProcess($iPid) ; On liste les process enfants
   If @error Then Return 1
   For $i = 1 To $aChildProcess[0][0]
      _ProcessWaitCloseRec($iPid) ; Pour chaque process enfant, on fait la même chose
   Next
   Return 1
EndFunc

Re: Shellexecutewait se ferme trop rapidement

Posté : mer. 01 juin 2022 02:33
par jchd
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...

Re: Shellexecutewait se ferme trop rapidement

Posté : mer. 01 juin 2022 08:24
par atheles
Bonjour,

Merci pour votre retour, même résultat le programme se lance commence l’exécution puis se ferme sans attendre la fin complète du programme...

Re: Shellexecutewait se ferme trop rapidement

Posté : mer. 01 juin 2022 09:58
par walkson
Bonjour,
à tout hasard...

Code : Tout sélectionner

#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")

Re: Shellexecutewait se ferme trop rapidement

Posté : mer. 01 juin 2022 15:59
par atheles
Merci Walkson,

Toujours pareil sleep ou pas.
résultat retour 1

J'ai essayé de "suivre" le programme je n'ai pas vu de sous-processus lors de l’exécution de ce programme.

Après je peux me contenter de lancer le .cmd mais je sais pas si je peux transmettre une variable dans ce cas ?

Re: Shellexecutewait se ferme trop rapidement

Posté : mer. 01 juin 2022 17:22
par walkson
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

Re: Shellexecutewait se ferme trop rapidement

Posté : jeu. 02 juin 2022 08:23
par atheles
Bonjour,

Je pense avoir trouvé une solution en exécutant le programme de cette façon :
Run("C:\WINDOWS\system32\cmd.exe")
WinWaitActive("C:\WINDOWS\system32\cmd.exe")
send('"C:\Program Files (x86)\HP\BIOS Configuration Utility\BIOSConfigUtility.exe"' & ' /setvalue:"Asset Tracking Number","xxxx.xxxx.xx"' & "{ENTER}")
Sleep(10000)
send("exit" & "{ENTER}")
ça fonctionne cependant reste a être sur que le programme soit terminé avant les 10 secondes de sleep.
j'ai essayé
ProcessWait("BIOSConfigUtility.exe")
mais dans ce cas je retrouve le comportement précédent ...

Re: Shellexecutewait se ferme trop rapidement

Posté : jeu. 02 juin 2022 17:05
par Tlem
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.

Cordialement