Hallo Leute, ist jemand auf ein JSL-Skript gestoßen, das nach einem Befehl zum Ausführen eines Programms nicht beendet wird?Ich versuche herauszufinden, ob Outlook geöffnet ist, und wenn nicht, öffne es.Hier ist mein Code.Für jede Hilfe wäre ich dankbar:
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>Ich schätze die Hilfe wirklich.Ich bin ein sehr neuer JMP-Benutzer und diese Community ist nach dem, was ich bisher gesehen habe, wirklich gut.
Vielleicht haben Sie damit Erfolg; Ich hatte in der Vergangenheit gemischte Erfolge bei der Anwendung Start um ein Programm von JMP zu trennen.
rp=RunProgram(Executable("cmd.exe"),options("/C start outlook.exe"))
Wenn RunProgram ein externes Programm startet und Sie ReadFunction("text") nicht verwenden, wird ein RunProgram-Objekt an JSL zurückgegeben, um das externe Programm (im Beispiel rp) zu verwalten. Wenn dieses Objekt zerstört wird, durch rp=0; Vielleicht oder indem es nicht in einer JSL-Variablen gespeichert wird, wartet JMP auf den Abschluss des externen Programms. Wenn Start trennt Outlook, dann ist rp<
ReadFunction("Text") lässt RunProgram außerdem warten und gibt der Einfachheit halber nur die gesamte Ausgabe und nicht ein Objekt zurück.
Drew,
Ich habe wmic.exe nicht geladen und bin nicht daran interessiert, es zu verwenden.Sie haben nicht erwähnt, ob der Fehler bei WMIC oder Outlook auftritt.
Run Program() führt die externe ausführbare Datei aus und führt die Befehle (Optionen) aus. Ich gehe davon aus, dass die Kontrolle nie an JMP zurückgegeben wurde, da es bei der Ausführung von Outlook keine Befehle gab, um die Kontrolle an das Programm zurückzugeben.Ich schlage vor, dass Sie für alle Fälle Open() verwenden.Wie bereits erwähnt, habe ich wmic.exe nicht verwendet; Führt es einen Befehl aus und beendet es oder hält es die Sitzung offen? Dies könnte auch dazu führen, dass „Run Program“ nie die Kontrolle an JMP zurückgibt.
Wie auch immer, unten ist ein Skript, das tasklist.exe verwendet.
Für den Fall, dass andere dieses Skript verwenden möchten, habe ich außerdem den Code eingefügt, um den Pfad von Outlook.exe mithilfe von where.exe zu finden. Ich habe auch 32-Bit-Outlook, aber mein Weg war anders als Ihrer.Beachten Sie, dass es eine Wartezeit von 3 Sekunden gibt, bis der Outlook-Pfad angezeigt wird. Dieser Untertitelcode kann entfernt werden.
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)
);