Script JSL - RunProgram sembra crash scriptEhi ragazzi, qualcuno ha incontrato uno script JSL che non si chiuderà dopo un comando di esecuzione del programma? Sto cercando di determinare se Outlook è aperto e se non lo si apre. Ecco il mio codice. Qualsiasi aiuto sarebbe apprezzato:
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 sembra crash scriptApprezzo davvero l'aiuto. Sono un utente molto nuovo per JMP e questa community è davvero buona da ciò che ho visto finora.
Re: script JSL - RunProgram sembra crash scriptPotresti avere un certo successo con questo; Ho avuto un successo misto in passato usando inizio per staccare un programma da JMP.
rp=RunProgram(Executable("cmd.exe"),options("/C start outlook.exe"))
Quando RunProgram avvia un programma esterno e non si utilizza ReadFunction ("testo"), un oggetto RunProgram viene restituito a JSL per gestire il programma esterno (rp, nell'esempio). Quando quell'oggetto viene distrutto, da rp = 0; forse, o non tenendolo in una variabile JSL, quindi JMP attende il completamento del programma esterno. Se inizio distacca la prospettiva, quindi rp << IsReadEOF sarà 1.
ReadFunction ("Testo") fa anche in modo che RunProgram attenda e, come comodità, restituisce tutto l'output piuttosto che un oggetto.
Re: script JSL - RunProgram sembra crash scriptsimpatico!
Re: script JSL - RunProgram sembra crash scriptHa disegnato,
Non ho caricato wmic.exe e non sono interessato a usarlo. Non hai menzionato se l'errore sta accadendo con wmic o outlook.
Esegui programma () esegue l'eseguibile esterno ed esegue i comandi (opzioni). Mi aspetto che il controllo non sia mai tornato a JMP perché non c'erano comandi per restituire il controllo al programma quando Outlook è stato eseguito. Ti suggerisco di usare Open () per ogni evenienza. Come già detto non ho usato wmic.exe; esegue un comando e termina o mantiene aperta la sessione? Questo potrebbe anche far sì che Run Program non restituisca mai il controllo a JMP.
Comunque, sotto c'è uno script che usa tasklist.exe.
Inoltre, nel caso in cui altri vorrebbero utilizzare questo script, ho incluso il codice per trovare il percorso di Outlook.exe utilizzando where.exe. Ho anche Outlook a 32 bit, ma il mio percorso era diverso dal tuo. Nota, c'è un'attesa di 3 secondi che mostra il percorso dell'outlook. Il codice di sottotitoli può essere rimosso.
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)
);