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

Signaler
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
-
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
-
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

12 réponses

Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
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
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
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
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
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="" />
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
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
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
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="" />
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
Non ce n'est pas une erreur

SISI231
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
oui euh dans mon programme j'ai bien sûr mis deux apostrophes excuse moi ...

SISI231
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
pour être clair :

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

SISI231
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
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="" />
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
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
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
J'ai enfin trouvé !


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

Ouf !

SISI231
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
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="" />