| Wordpad | |
|
|
Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Wordpad Dim 29 Avr 2018 - 10:40 | |
| - Code:
-
DIM wpd$ wpd$ = "C:\Windows\System32\write.exe": ' Wordpad EXECUTE_WAIT wpd$ TERMINATE Pourquoi est-ce que l'on sort tout de suite de l'Execute_Wait, sans attendre la fermeture de write.exe ?? | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 11:01 | |
| Je ne vois qu'une explication: c'est un bug. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 11:11 | |
| Bonjour Klaus, tu me rassures (si on peut dire), et là je m'absente pour la journée. | |
|
| |
silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 12:40 | |
| Je viens d'essayer, c'est plutôt subtil, 'execute_wait' attend bien la fin du fichier, mais seulement si c'est une application panoramic! Même chose avec une version plus ancienne(0927i5) | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 13:15 | |
| Remplacer le TERMINATE par END. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 13:37 | |
| - Citation :
- Remplacer le TERMINATE par END.
Ben... non, Papydall ! Si JL35 a mis un TERMINATE à la fin, c'est justement pour mettre le problème en évidence, avec peu de lignes. Ce qui est clair, c'est que Panoramic, contrairement à ce que laisse entendre le mot-clé et à ce que dit la doc: - Citation :
- La commande EXECUTE_WAIT F exécute le fichier F et attend la fin.
Donc, en toute logique, lors de l'exécution de la commande Panoramic suivante, on doit être assuré que le programme lancé a été terminé. Sinon, il n'y a aucune différence avec la commande EXECUTE. D'ailleurs, facile à vérifier: place une commande MESSAGE après EXECUTE_WAIT, et tu verras que le message vient alors que le programme lancé est toujours actif. C'est bien un bug. | |
|
| |
Navigateur
Nombre de messages : 42 Age : 76 Localisation : Les Clayes-sous-bois 78340 Date d'inscription : 02/09/2016
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 16:04 | |
| Bonjour,
Le problème vient du fait que le nom de la tâche de "write.exe" une fois lancé est "wordpad.exe" Comme a priori EXECUTE_WAIT recherche une tâche dont le nom correspond au nom qu'on lui a transmis, soit "write.exe", il suppose qu'elle est (déjà) terminée et revient aussitôt.
Pour le vérifier, copier c:\windows\system32\write.exe dans votre répertoire courant et renommer le en wordpad.exe et exécuter le programme suivant :
wpd$ = "wordpad.exe" EXECUTE_WAIT wpd$ terminate
Maintenant, la fenêtre Panoramic reste ouverte tant que wordpad n'est pas fermé.
Navigateur
PS : vous pouvez utiliser la commande tasklist /fi "imagename eq nom_image" pour voir si nom_image est en cours d'exécution. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 16:58 | |
| Dans ce cas, il suffira de créer un petit fichier BAT qui, lui, va lancer WRITE.exe. Et on lance de fichier BAT avec EXECUTE_WAIT. Ca devrait résoudre le problème. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 18:31 | |
| Merci Navigateur, tu as mis le doigt dessus, c'est que c'est un cas particulier de nom... et donc ce n'est pas un bug. (je lance write.exe et dans tasklist j'ai wordpad.exe actif) Et connaissant le problème, la solution est facile à imaginer. Merci à tous pour vos remarques. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 19:11 | |
| Ce n'est peut-être pas aussi simple que ce que je pensais... @Klaus: le fait de passer par un fichier .bat ne change rien, ça rend la main tout de suite. Si après l'Execute_Wait je fais une boucle temporisée avec examen de tasklist (pour voir si wordpad.exe est présent), du genre: - Code:
-
EXECUTE_WAIT wpd$: ' write.exe a$ = "wordpad.exe" WHILE INSTR(a$,"wordpad.exe") > 0 PAUSE 200 EXECUTE_WAIT "cmd.exe /c tasklist.exe | clip": a$ = CLIPBOARD_STRING_PASTE$ END_WHILE ça marche, mais ça fait apparaître une fenêtre noire à chaque passage dans la boucle... très inesthétique ! | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 19:16 | |
| Comment lances-tu le fichier BAT ? Car, en tout état de cause, le programme lancé doit être CMD.exe.Il faut peut-être ajouter la commande PAUSE à la fin du fichier. Si tu lances CMD avec l'option /C puis le nom du fichier BAT, le seul processus lancé par Panoramic sera alors CMD.exe et il reste actif tant que PAUSE n'est pas validé. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Wordpad Dim 29 Avr 2018 - 19:35 | |
| Je lance le bat comme d'habitude: cmd.exe /c xxx.bat, il me rend la main tout de suite. J'ai essayé autre chose, un peu lourd et sans doute pas très élégant, mais ça marche et je n'ai pas trouvé mieux: supprimer l'apparition de la fenêtre noire à chaque boucle en passant par un script vbs (les chemins de fichiers sont à adapter): - Code:
-
DIM wpd$,wba$,vb$,q$,a$ wpd$ = "C:\Windows\System32\write.exe" wba$ = "Z:\word.bat" vb$ = "Z:\vb.vbs" q$ = CHR$(34)
EXECUTE_WAIT wpd$: ' -> Z:\Document.rtf FILE_OPEN_WRITE 1,wba$: ' .BAT, provisoire FILE_WRITELN 1,"@echo off" FILE_WRITELN 1,"tasklist.exe | clip" FILE_CLOSE 1 FILE_OPEN_WRITE 1,vb$: ' script vbs, provisoire FILE_WRITELN 1,"CreateObject("+q$+"Wscript.Shell"+q$+").Run "+q$+wba$+q$+",0,True" FILE_CLOSE 1 a$ = "wordpad.exe" WHILE INSTR(a$,"wordpad.exe") > 0 PAUSE 200 EXECUTE_WAIT "WSCRIPT.exe "+vb$: a$ = CLIPBOARD_STRING_PASTE$ END_WHILE DELETE wba$: DELETE vb$ stop | |
|
| |
silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 0:04 | |
| Je procède de cette manière pour mon projet, mais je ne sais pas si ça va aller pour le tien: - Code:
-
DIM wpd$ wpd$ = "C:\Windows\System32\write.exe": ' Wordpad EXECUTE_WAIT wpd$: ' write.exe
repeat : until handle_form("Document - WordPad")>0 :' attendre le démarrage de wordpad WHILE handle_form("Document - WordPad") > 0 : END_WHILE :' attendre la cloture de wordpad print "Worpad arrêté" | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 2:04 | |
| Voici une façon "propre" de lancer Write.exe (ou n'importe quoi d'autre...), en attendant la fiin du programme lancé et sans fenêtre DOS noire: - Code:
-
DIM wpd$ wpd$ = "C:\Windows\System32\write.exe": ' Wordpad file_open_write 1,"wpd.bat" file_writeln 1,"echo off" file_writeln 1,"start "+wpd$ file_writeln 1,":WAITLOOP" file_writeln 1,"tasklist /FI "+chr$(34)+"IMAGENAME eq wordpad.exe"+chr$(34)+" 2>NUL | find /I /N "+chr$(34)+"wordpad.exe"+chr$(34)+">NUL" file_writeln 1,"if "+chr$(34)+"%ERRORLEVEL%"+chr$(34)+"=="+chr$(34)+"0"+chr$(34)+" goto RUNNING" file_writeln 1,"goto NOTRUNNING"
file_writeln 1,":RUNNING" file_writeln 1,"ping" file_writeln 1,"goto WAITLOOP"
file_writeln 1,":NOTRUNNING" file_close 1
file_open_write 1,"wpd.vbs" file_writeln 1,"CreateObject("+chr$(34)+"Wscript.Shell"+chr$(34)+").Run "+chr$(34)+"wpd.bat"+chr$(34)+",0,True" file_close 1
EXECUTE_WAIT "wpd.vbs" file_delete "wpd.bat" file_delete "wpd.vbs" TERMINATE
Exercice: transformer cela en une SUB du genre ExecuteAndWait(prog$)... | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 9:46 | |
| @silverman Merci pour la méthode, élégante, succincte, et qui marche parfaitement chez moi (mais il fallait y penser, pas évident) !
Mais je vais me faire également une Sub avec la méthode Klaus, qui a l'avantage d'être universelle et de supprimer cette fichue fenêtre noire intempestive pour les autres cas.
En tout cas, merci à tous les deux.
PS ça marche Klaus, mais j'ai quand même la fenêtre noire d'exécution de Cscript.exe... Finalement, et comme le problème est très particulier et ne se pose a priori qu'avec write.exe (qui est enregistré comme wordpad à l'exécution), je vais utiliser la méthode silverman efficace et peu encombrante (j'ai simplement ajouté une Pause de 300 dans le While/End_While pour que ça ne mouline pas trop vite). | |
|
| |
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 10:16 | |
| Et pourquoi ne pas appeler directement WORDPAD comme le suggérait Navigateur ? - Code:
-
wpd$ = "wordpad.exe" EXECUTE_WAIT wpd$ terminate
J'ai testé et ça marche très bien ! | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 10:16 | |
| - Citation :
- j'ai quand même la fenêtre noire d'exécution de Cscript.exe...
C'est WScript, pas CScript... et je n'ai aucune fenêtre noire. Il ne peut pas y en avoir, avec cette technique. Je fais faire une SUB autonome qui va gérer tous les cas. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 10:19 | |
| Ben... oui, Minibug, tu as raison ! Ca marche ! Mais pourquoi est-on allé chercher midi à 14 heures ? | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 10:42 | |
| Juste pour le plaisir: le code suivant est la conversion en SUB de ma solution ci-dessus, en tenant compte de la remarque de Minibug concernant le nom du fichier. - Code:
-
' lancer_wordpad_et_attendre.bas
DIM wpd$ wpd$ = "wordpad.exe": ' Wordpad ExecuteAndWait(wpd$) terminate
sub ExecuteAndWait(prog$) file_open_write 1,"temp.bat" file_writeln 1,"echo off" file_writeln 1,"start "+prog$ file_writeln 1,":WAITLOOP" file_writeln 1,"tasklist /FI "+chr$(34)+"IMAGENAME eq "+prog$+chr$(34)+" 2>NUL | find /I /N "+chr$(34)+prog$+chr$(34)+">NUL" file_writeln 1,"if "+chr$(34)+"%ERRORLEVEL%"+chr$(34)+"=="+chr$(34)+"0"+chr$(34)+" goto RUNNING" file_writeln 1,"goto NOTRUNNING"
file_writeln 1,":RUNNING" file_writeln 1,"ping" file_writeln 1,"goto WAITLOOP"
file_writeln 1,":NOTRUNNING" file_close 1
file_open_write 1,"temp.vbs" file_writeln 1,"CreateObject("+chr$(34)+"Wscript.Shell"+chr$(34)+").Run "+chr$(34)+"temp.bat"+chr$(34)+",0,True" file_close 1
EXECUTE_WAIT "temp.vbs" file_delete "temp.bat" file_delete "temp.vbs" end_sub Cette sub pourra être aisément adapté au cas où le programme à exécuter serait dans un autre dossier, via FILE_EXTRACT_NAME pour récupérer le nom de l'EXE pour les tests dans le fichier vbs. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 12:17 | |
| Et finalement, concernant write.exe, j'avais dû me dire sans doute "Poujrquoi faire simple quand on peut faire compliqué ?" Alors que la solution était toute simple, comme l'a fait remarquer Navigateur, et il n'est même pas besoin de recopier write.exe dans le répertoire courant, ça marche directement comme ceci: - Code:
-
EXECUTE_WAIT "Wordpad.exe" Et c'est tout ! Que de temps perdu pour rien... | |
|
| |
Navigateur
Nombre de messages : 42 Age : 76 Localisation : Les Clayes-sous-bois 78340 Date d'inscription : 02/09/2016
| Sujet: Re: Wordpad Lun 30 Avr 2018 - 13:07 | |
| Bonjour, @ JL35, copier le programme avec son "vrai" nom, c'est la solution la plus simple, si on veut bien créer une copie, pas exemple s'elle n'est pas trop volumineuse. En fait, j'ai regardé ce problème dans le cadre de mon apprentissage de Panobasic. Merci à klaus pour ses interventions/solutions qui m'ont permis de réviser mes connaissances sur les commandes des fichiers batch. Et pour continuer d'alimenter ce sujet (ce n'est pas une perte de temps !) et comme exercice d'utilisation des FNC, j'ai essayé de trouver une solution sans passer par l'étape vbs. Code : - Code:
-
DIM wpd1$, wpd2$ DIM cmd$, qu$, sp$
qu$ = chr$(34) sp$ = " " wpd1$ = "c:\windows\system32\write.exe" : ' Write wpd2$ = "wordpad.exe" : ' Write alias
Running_Test_bat_Make() EXECUTE_WAIT2(wpd1$, wpd2$) TERMINATE
FNC EXECUTE_WAIT2(file_id$, file_alias$) cmd$ = "Running_Test.bat | " + file_id$ + sp$ + file_alias$ EXECUTE_WAIT cmd$ END_FNC
FNC Running_Test_bat_Make() cmd$ = "FOR /F %%x IN ('tasklist /NH /FI " + qu$ + "IMAGENAME eq %EXE2%" + qu$ + "') DO IF /I %%x NEQ %EXE2% exit /B" file_open_write 1,"Running_Test.bat" file_writeln 1, "@echo off" file_writeln 1, "set EXE1=%1" file_writeln 1, "set EXE2=%2" file_writeln 1, "%EXE1%" file_writeln 1, ":Running_Test" file_writeln 1, "timeout /T 1 /NOBREAK >nul" file_writeln 1, cmd$ file_writeln 1, "goto Running_Test" file_close 1 END_FNC
Navigateur PS : si on a créé une fois pour toute "Running_Test.bat", on peut supprimer la FNC correspondante et son appel | |
|
| |
Contenu sponsorisé
| Sujet: Re: Wordpad | |
| |
|
| |
| Wordpad | |
|