Shellexecutewait se ferme trop rapidement

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
atheles
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 30 mai 2022 14:12
Status : Hors ligne

Shellexecutewait se ferme trop rapidement

#1

Message 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
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: Shellexecutewait se ferme trop rapidement

#2

Message 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
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: Shellexecutewait se ferme trop rapidement

#3

Message 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...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
atheles
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 30 mai 2022 14:12
Status : Hors ligne

Re: Shellexecutewait se ferme trop rapidement

#4

Message 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...
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Shellexecutewait se ferme trop rapidement

#5

Message 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")
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
atheles
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 30 mai 2022 14:12
Status : Hors ligne

Re: Shellexecutewait se ferme trop rapidement

#6

Message 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 ?
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Shellexecutewait se ferme trop rapidement

#7

Message 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
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
atheles
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 30 mai 2022 14:12
Status : Hors ligne

Re: Shellexecutewait se ferme trop rapidement

#8

Message 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 ...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Shellexecutewait se ferme trop rapidement

#9

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre