Script JSL - RunProgram semble planter le scriptHé les gars, quelqu'un a-t-il rencontré un script JSL qui ne se ferme pas après une commande de programme d'exécution ?J'essaie de déterminer si Outlook est ouvert et si ce n'est pas le cas, ouvrez-le.Voici mon code.Toute aide serait appréciée:
Names Default To Here( 1 ); // Make sure variables are stored in this procedure
Clear Log(); // Clear the JMP Log - Select View - Log
// Get the current windows processes (process list) using teh wmic.exe
windowsProcesses = RunProgram(executable("wmic"),options({"process list"}),
readfunction(function({this},write(this<<READ></READ>Re : Script JSL - RunProgram semble planter le scriptJ'apprécie vraiment l'aide.Je suis un très nouvel utilisateur de JMP et cette communauté est vraiment bonne d'après ce que j'ai vu jusqu'à présent.
Re : Script JSL - RunProgram semble planter le scriptVous pourriez avoir un certain succès avec cela; J'ai eu un succès mitigé dans le passé en utilisant commencer pour détacher un programme de JMP.
rp=RunProgram(Executable("cmd.exe"),options("/C start outlook.exe"))
Lorsque RunProgram démarre un programme externe et que vous n'utilisez pas ReadFunction("text"), un objet RunProgram est renvoyé à JSL pour gérer le programme externe (rp, dans l'exemple). Lorsque cet objet est détruit, par rp=0 ; peut-être, ou en ne le conservant pas dans une variable JSL, JMP attend que le programme externe se termine. Si commencer détache Outlook, alors rp<
ReadFunction("Text") fait également attendre RunProgram et, par commodité, renvoie simplement toute la sortie plutôt qu'un objet.
Re : Script JSL - RunProgram semble planter le scriptbon!
Re : Script JSL - RunProgram semble planter le scriptA dessiné,
Je n'ai pas chargé wmic.exe et je ne suis pas intéressé à l'utiliser.Vous n'avez pas mentionné si l'erreur se produit avec wmic ou outlook.
Run Program() exécute l'exécutable externe et exécute les commandes (options). Je m'attends à ce que le contrôle ne soit jamais revenu à JMP car il n'y avait aucune commande pour rendre le contrôle au programme lors de l'exécution d'Outlook.Je vous suggère d'utiliser Open() au cas où.Comme indiqué, je n'ai pas utilisé wmic.exe; exécute-t-il une commande et se termine-t-il, ou garde-t-il la session ouverte ? Cela pourrait également empêcher Exécuter le programme de rendre le contrôle à JMP.
Quoi qu'il en soit, voici un script utilisant tasklist.exe.
De plus, juste au cas où d'autres voudraient utiliser ce script, j'ai inclus le code pour trouver le chemin d'Outlook.exe en utilisant where.exe. J'ai aussi Outlook 32 bits mais mon chemin était différent du vôtre.Notez qu'il y a une attente de 3 secondes qui affiche le outlookpath. Ce code de légende peut être supprimé.
Names Default To Here( 1 ); // Make sure variables are stored in this procedure
Clear Log(); // Clear the JMP Log - Select View - Log
//find outlook
outlookpath = "";
cmd1 = "\[/c where /R "C:\Program Files (x86)" OUTLOOK.EXE]\";
rp0 = RunProgram(Executable("CMD.EXE" ),
Options({Eval(cmd1)}),
Read Function("text")
);
outval = words(Trim(rp0), "\!n");
if(StartsWith(outval[1], "C:\Program Files"), outlookpath=outval[1]);
//only run this if not found
if (outlookpath =="", //try for 64 bit version of excel
cmd1 = "\[/c where /R "C:\Program Files" OUTLOOK.EXE]\";
rp0 = RunProgram(Executable("CMD.EXE" ),
Options({Eval(cmd1)}),
Read Function("text")
);
outval = words(Trim(rp0), "\!n");
if(StartsWith(outval[1], "C:\Program Files"), outlookpath=outval[1] );
);
if(outlookpath =="", Caption("Cannot find Excel ... aborting"),
Caption( "Outlook path is: "|| outlookpath) );
wait(3);
caption(remove);
//_____________________________________________________________________________
windowsProcesses = RunProgram(executable("CMD.exe"),options({"/c tasklist /FI \!"IMAGENAME eq outlook.exe\!""}),
readfunction("text")
);
/* to get a list of all processes just use /c tasklist */
show(windowsProcesses);
//
// Check if outlook is open by searching the log file
openYesNo = If(contains(lowercase(Trim(windowsProcesses)),"outlook"),1,0);
// Open Outlook if it is currently closed
If( openYesNo == 0,
Open(outlookpath)
);