Aller au contenu

Lancer un .BAT sans la fenêtre noire


Fraid

Messages recommandés

Bonjour,

 

Si vous exécutez des scripts en .bat depuis un lisp,

une vilaine fenêtre noire apparais aussi vite qu'elle disparais.

 

Et bien, c'est finis.

 

Je l'ai eu.

 

(defun runscr (file / obj ret)
   (setq ret "Exécution terminée")
   (if (findfile file) ;si le fichier est bien présent
       (if (vl-catch-all-error-p ;si plantation
               (vl-catch-all-apply 
                   'vlax-invoke-method (list   (setq obj (vlax-get-or-create-object "WScript.Shell"))
                                                "Run" 
                                                 file 
                                                 0 ;c'est ici que la console la ferme
                                                 :vlax-true
                                       )
               )
           )   
           (setq ret "Fichier invalide")
           (vlax-release-object obj)
       )
     (setq ret "Fichier introuvable")
   )
   ret
)

 

L'argument file est le chemin complet du .bat ex: "c:/MonDossier/MonFichier.bat"

Répond un string

quasiment implantable.

s'utilise à la place de la fonction (startapp file) ou (command "_.shell" file)

en fait j'utilise cette fonction depuis longtemps, mais pas pour des .bat.

l'idée m'est venu d'un coup

je partage, car cela a été une bonne prise de tête pour certain.

Modifié par Fraid
Lien vers le commentaire
Partager sur d’autres sites

le temps que le .bat finisse sont travail

 

le problème est quel travail.

l’idéal est que le .bat retourne un fichier texte, la, c'est facile à détecter.

car détecté sa fermeture, est plus compliqué mais faisable en établissant la liste des process en cours avec WMI par exemple.

c'est une exploration que Patrick35 nous à partagé.

mais je ne retrouve pas le post.

 

 

elle est pas vilaine, cette fenêtre, elle est "vintage" !

 

C'est vrais, quand je lance un .bat en dehors d'Autocad, cela ne me gène pas du tout.

Par contre quand tu l'appel dans une boucle lisp, la, c'est vraiment désagréable.

Lien vers le commentaire
Partager sur d’autres sites

J'ai une "moulinette" qui me crée les fichiers PLT ou PDF.

 

Du coup pendant le temps de création je voie défilé sur la fenêtre DOS, toute la procédure.

 

EN PJ Exemple d'un de mes BAT et SCR ... (J'en ai des dixaines)

 

Du coup si je pouvais avoir une simple fenêtre style "La création des fichiers est en cours" ....

BatchPrint.zip

Lien vers le commentaire
Partager sur d’autres sites

avoir une simple fenêtre

À la base, je souhaitais éliminer une fenêtre

c'est pas pour en mettre une autre...

je te propose plutôt un message qui apparait simplement dans l'invite de commande d'Autocad.

 

(defun sf-imp-run (file / obj lprocs scrproc)
   (setq lprocs (p35-appli));liste des process en cours
   (princ "\nScript en cours d'exécution...")
   (if (findfile file)
       (if (vl-catch-all-error-p 
               (vl-catch-all-apply 'vlax-invoke-method (list   (setq obj (vlax-get-or-create-object "WScript.Shell"))
                                                               "Run" 
                                                               file 
                                                               0 
                                                               :vlax-true
                                                       )
               )
           )   
           (princ "\nFichier invalide")
           (progn
               (vlax-release-object obj)
               (foreach proc (p35-appli)
                   (if (not (member proc lprocs))(setq scrproc proc));détermine le process en comparant ceux du debut et pendant
               )
               (while (member scrproc (p35-appli));tant que le process est actif on attend
                   (command "_.delay" 200)
               )
               (princ "\nExécution du script terminée.")
           )
       )
     (princ "\nFichier introuvable")
   )
   (princ)
)

(defun p35-appli(/ apps lst meth1 meth2 WMI)
   (setq WMI (vlax-create-object "WbemScripting.SWbemLocator")
         meth1 (vlax-invoke WMI 'ConnectServer nil nil nil nil nil nil nil nil)
         meth2 (vlax-invoke meth1 'ExecQuery "Select * from Win32_Process")
   )
   (vlax-for item meth2
       (setq lst (cons (vlax-get item 'CommandLine) lst))
   )
   (foreach item (list WMI meth1 meth2)
       (vlax-release-object item)
   )
   (vl-remove nil lst)
)

 

cela n'a d’intérêt que si effectivement cela prend du temps.

sinon on en perd....

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Ca c'est sympa déjà, ca me plais, pour des petit bat rapide.

 

Mais si on change de fichiers DWG, on ne voit plus l'information.

 

En gros quand on fait tourner la création des fichier PLT, cela peut prendre des heures et pendant ce temps je voie cela en dehors d'autocad (PJ), et ca défile pour chaque fichier créé.

 

Je cherche depuis un bon moment comment remplacer cette fenêtre par une petite comme expliqué sur mon post précédent.

post-59661-0-12731200-1612337587_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

Yop

 

Afficher une fenêtre sans bouton ok, qui s’éteint à la fermeture d'une appli. externe

ce n'est pas si facile en fait.

en DCL, si il n'y a pas de bouton, il est déclaré invalide.

avec le popup d'un objet WScript pas moyen non plus

j'ai regardé dans le dos_lib, non plus.

j'envisage donc, soit de changer de point de vue et

de lancer les scripts à travers une boite de dialogue banal qui disparaîtrait qu'une fois le process clos.

ou en affichant une petite page html et la clore une fois le process clos (la, c'est une petite exploration...)

 

c'est parti vers l'inconnu et au delà....

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Si tu ou quelqu'un sait comment faire un afficher une fenêtre d'attente le temps que le .bat finisse sont travail, alors la ce serais le graal !

 

une première solution avec un DCL qui utilise la fonction runscr (au début du post)

 

le DCL à enregistrer sous run.dcl

 

run :dialog {
   label = "RUN Exécution d'un Script";
   :text { key = "T1";
           alignment = centered;
       }
   :image { key = "img";
            width = 14.5;
            height = 7;
   }
   spacer;
   ok_cancel;  
}

 

le lanceur

 

(defun c:run ( / id fil file x y msg)
   (setq   file (getfiled "Choisir un fichier" "c:\\" "" 4)
           fil (strcat (vl-filename-base file) (vl-filename-extension file))
           id (load_dialog "run.dcl")
           msg "Abandon"
   )
   (if (new_dialog "run" id)
     (progn 
       (setq x (dimx_tile "img") y (dimy_tile "img"));width et height du dcl
       (set_tile "T1" (strcat "Voulez vous Exécuter " fil " ?"))
       (start_image "img")
           (fill_image 0 0 x y -15);fond
           (slide_image 6 0 x y "bat");6 pour centrer
       (end_image)
       (action_tile "accept" "(set_tile \"T1\" (strcat \"Exécution de \" fil \" en cours ...\"))
                               (setq msg (runscr file))
                               (done_dialog 1)
                             "
       )
       (action_tile "cancel" "(done_dialog 0)")
       (start_dialog)
       (unload_dialog id)
     )
   )
   (princ (strcat "\n" msg))
   (princ)
)

il faut télécharger et placer bat.sld à coté du lisp

 

La boite de dialogue se ferme quand le script est terminé.

pas moyen de mettre une animation, tout se bloque pendant l’exécution d'un .bat.

bat.zip

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité