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

sisi231 210 Messages postés mercredi 5 mars 2003Date d'inscription 29 mars 2013 Dernière intervention - 9 janv. 2008 à 13:52 - Dernière réponse : Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention
- 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 

14 réponses

Répondre au sujet
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 9 janv. 2008 à 21:29
+3
Utile
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="" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
sisi231 210 Messages postés mercredi 5 mars 2003Date d'inscription 29 mars 2013 Dernière intervention - 9 janv. 2008 à 17:19
+2
Utile
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
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 9 janv. 2008 à 14:20
0
Utile
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
sisi231 210 Messages postés mercredi 5 mars 2003Date d'inscription 29 mars 2013 Dernière intervention - 9 janv. 2008 à 14:47
0
Utile
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
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 9 janv. 2008 à 15:08
0
Utile
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
sisi231 210 Messages postés mercredi 5 mars 2003Date d'inscription 29 mars 2013 Dernière intervention - 9 janv. 2008 à 15:21
0
Utile
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
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 9 janv. 2008 à 15:34
0
Utile
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
sisi231 210 Messages postés mercredi 5 mars 2003Date d'inscription 29 mars 2013 Dernière intervention - 9 janv. 2008 à 15:39
0
Utile
Non ce n'est pas une erreur

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

SISI231
Commenter la réponse de sisi231
sisi231 210 Messages postés mercredi 5 mars 2003Date d'inscription 29 mars 2013 Dernière intervention - 9 janv. 2008 à 15:44
0
Utile
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
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 9 janv. 2008 à 16:08
0
Utile
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
sisi231 210 Messages postés mercredi 5 mars 2003Date d'inscription 29 mars 2013 Dernière intervention - 9 janv. 2008 à 16:49
0
Utile
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
sisi231 210 Messages postés mercredi 5 mars 2003Date d'inscription 29 mars 2013 Dernière intervention - 9 janv. 2008 à 17:04
0
Utile
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
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 9 janv. 2008 à 17:07
0
Utile
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.