Exécuter Batch et attendre fin de son exécution [Résolu]

Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 13:52 - Dernière réponse :
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 9 janv. 2008 à 21:29
Bonjour !

Je voudrais le corps d'une procédure dont l'entête serait :

procedure execute_batch (Batch_File: TFilename ; Visible : Boolean);

je voudrais que cette procédure éxécute un fichier batch et attende la fin de son exécution, ainsi que l'on puisse préciser à travers la propriété visible si sa fenêtre est visible ou non.

Merci.

SISI231
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 9 janv. 2008 à 21:29
3
Merci
J'avais pas rafraichis avant de poster mon dernier message.

content que ce soit réglé  

Mais je te conseil quand même de jeter un oeil sur la source de Florenth
elle utilise aussi CreateProcess mais elle empêche que l'application soit figée ... à voir absolument

 
@+
Cirec

<hr siz="" />

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 17:19
2
Merci
Ca y est j'ai ma fonction complète, testée peut-être améliorable mais fonctionnelle c'est déjà ça !


function LanceBatchAttenteFin(NomFichier:string;visible:boolean):boolean;
{permet de lancer un batch. NomFichier est le nom avec chemin     }
{de ce batch ou d'un raccourci qui pointe vers cet exécutable.   }
{ notre programme est arrété tant que l'exécutable n'est pas fini      }
{tout est arrété on ne peut donc même plus déplacer sa fenêtre.        }
{mettre visible à false pour cacher la fenêtre du batch}
{ il est donc préférable de la rendre invisible avant le lancement     }
{de cette fonction.                                                    }
{ LanceAppliAttenteFin renvoie true si le lancement s'est bien passé   }
var
  StartInfo : TStartupInfo;
  ProcessInformation : TProcessInformation;
  i:integer;
begin
  if visible then
  i:=0
  else
  i:=CREATE_NO_WINDOW;
  result:=true;
  ZeroMemory(@StartInfo, sizeof(StartInfo)); // remplie de 0 StartInfo
  StartInfo.cb:=sizeof(StartInfo);
  if CreateProcess(nil,PChar(NomFichier),nil,nil,true,i,nil,nil,
  StartInfo,ProcessInformation)
  then WaitForSingleObject(ProcessInformation.hProcess, INFINITE)// attend que l'application désignée par le handle ProcessInformation.hProcess soit terminée
  else result:=false;
end;

SISI231
Commenter la réponse de sisi231
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 9 janv. 2008 à 14:20
0
Merci
Salut,

en cherchant un peut tu aurais pu trouver la solution par toi même

Regarde cette source ... elle contient tout ce que tu cherches.

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 14:47
0
Merci
Cela permet de lancer des commandes depuis CMD et non de lancer des BATCH !

Je ne veux pas les ouvrir avec Shellexecute car cela n'attend pas la fin de l'exécution des Batch, ça doit être un truc avec CreateProcess mais je ne sais pas avec quel programme s'ouvrent les programmes BATCH !...

SISI231
Commenter la réponse de sisi231
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 9 janv. 2008 à 15:08
0
Merci
Non regarde bien la source elle fait exactement ce que tu demandes

tu peux :
Lancer n'importe quel fichier (Batch y compris)
en attendre la fin ou non et voir la fenêtre dos ou non

en suite tu peux aussi par cette méthode utiliser des fichiers .CMD à la place de .BAT
Les Fichiers .CMD étant des .BAT plus évolués ... donc plus de possibilités et flexibilités (Ex Ajouter/Modifier/Supprimer une entré dans le registre)

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 15:21
0
Merci
Je peux essayer avec :

ShellExecute(Handle, Nil, 'CMD' ,
'/k "start /wait C:/Program Files/Program'Action/SmartCopy/Commandes.bat"', Nil ,SW_HIDE);

pour lancer mon bat mais s'il ya des espaces comme dans Program Files ça ne marchera pas, s'il te plaît donne-moi un exemple !

SISI231
Commenter la réponse de sisi231
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 9 janv. 2008 à 15:34
0
Merci
Bon juste avant de me lancer dans testes une petite question :

ça ne serait pas une erreur ça :
C:/Program Files/Program'Action/SmartCopy/Commandes.bat
ça ne serait pas :
C:/Program Files/Program/Action/SmartCopy/Commandes.bat

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 15:39
0
Merci
Non ce n'est pas une erreur

SISI231
Commenter la réponse de sisi231
Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 15:43
0
Merci
oui euh dans mon programme j'ai bien sûr mis deux apostrophes excuse moi ...

SISI231
Commenter la réponse de sisi231
Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 15:44
0
Merci
pour être clair :

ShellExecute(Handle, Nil, 'CMD' ,
'/k "start /wait C:/Program Files/Program''Action/SmartCopy/Commandes.bat"', Nil ,SW_HIDE);

SISI231
Commenter la réponse de sisi231
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 9 janv. 2008 à 16:08
0
Merci
Voilà :


ShellExecute(Handle, Nil, 'CMD' , '/k "C:/Program Files/Program'Action/SmartCopy/Commandes.bat"', Nil ,SW_HIDE);

Avec une seule apostrophe


Start et /Wait ne sont pas utiles ici et faisaient planter la commande

Le comportement est exactement le même
c'est le switch /k qui détermine si on attend ou non

@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 16:49
0
Merci
Le problème est que la console ne se ferme pas à la fin du batch (comme avant avec ShellExecute(0, 'open', pchar(bat_file) ,
             nil, Nil ,
             SW_SHOW);) et que si l'on exécute :



ShellExecute(Handle, Nil, 'CMD' , '/k "C:/Program Files/Program'Action/SmartCopy/Commandes.bat"', Nil ,SW_HIDE);
ShowMessage('Fini !');



Fini s'affiche avant la fin du batch donc ce que j'ai demandé n'a pas été résolu !

Je veux ce que l'on appelle une instruction synchronous pour employer le terme comme dans PlaySound.

Je pense qu'on doit passer par CreateProcess en lançant le programme qui ouvre le bat et attendre sa fermeture avec WaitForSingleObject, mais deux problèmes :

- je ne sais pas quel est le programme qui ouvre un fichier BAT
- je ne sais pas comment passer un paramètre au programme dans la procédure connue : LanceAppliAttenteFin dont le code est à l'adresse :

http://www.phidels.com/php/index.php3?page=../php/pagetelechargementzip.php3&id=66&PHPSESSID=159ceec2a86678e24708e72a1cba8e52

Amicalement.

SISI231
Commenter la réponse de sisi231
Messages postés
210
Date d'inscription
mercredi 5 mars 2003
Dernière intervention
29 mars 2013
- 9 janv. 2008 à 17:04
0
Merci
J'ai enfin trouvé !


LanceAppliAttenteFin marche avec un bat comme paramètre !
Je pensais que ça ne marchait qu'avec les exe !

Ouf !

SISI231
Commenter la réponse de sisi231
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 9 janv. 2008 à 17:07
0
Merci
Ok

bon de suite j'ai pas trop le temps (je dois me sauver) mais dès mon retour je me penche sur le problème et te donnerai une solution

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.