Table of Contents

Running an Executable from a Script

In MIStudio you can use the CommmandExecutor to run an external executable or script (.sh or .bat). In a script you can use the Java Runtime and create a Process to run a command.

Simple Example with One Parameter

var Runtime = Java.type("java.lang.Runtime");
var Process = Java.type("java.lang.Process");
 //This runs the external program
//Consider running this in its own Thread
 
        try
        {
            // Command to create an external process
            command = "notepad";
  
            // Running the above command
            run  = Runtime.getRuntime();
            proc = run.exec(command); //will launch notepad.exe on windows
        }  catch (e) {             
           print("error in script: \n"+e.stack);
        }
 
output="finished";

Example with a Command Array

In this example we need to run a CMD shell to launch a PDF viewer. This will run the default viewer on the system using Windows start.

var Runtime = Java.type("java.lang.Runtime");
var Process = Java.type("java.lang.Process");
 
 
  pdfname="C:/Reports/SummaryReport_2023-01-24_12-58-26.pdf";
 
  //launch pdf viewer using Windows START
 
  command = ["cmd.exe","/c","start",pdfname];
 
  try	 {
     print("command for launching pdf viewer: "+command);
     rt  = Runtime.getRuntime();
     proc = rt.exec(command);
   }  catch (e) {             
	print("error in script: \n"+e.stack);
 }
 
incomingValue;

Running a Command with an Output

Sometimes you might need to run a command or script on a system and need to capture the output of the exec. In the example below the Windows tzutil (time zone utility) to return a time zone string. The command is “tzutil /g”. The return string will be something such as “Pacific Standard Time”.

In this example we have set up a BroadcastServer (Variable) called “LocalTimeZone” under UtilityServers in Devices. The result is stored in this BCS.

//test script to read the local time zone and store it in a BCS "LocalTimeZone"
var Runtime = Java.type("java.lang.Runtime");
var Process = Java.type("java.lang.Process");
var BufferedReader  = Java.type("java.io.BufferedReader");
var InputStreamReader = Java.type("java.io.InputStreamReader");
 
 
  //get the local time zone for this Windows system using tzutil /g
 
  command = ["tzutil","/g"];
  timezone="";
  try	 {
     //print("command: "+command);
     rt  = Runtime.getRuntime();
     proc = rt.exec(command);
     //proc contains the return value, a string, but is an InputStream, so need to read it one line at a time (should only be one line in this example)
     resultLine="";
     stdIn = new BufferedReader(new InputStreamReader (proc.getInputStream()));
     while ((resultLine = stdIn.readLine()) != null) {
        timezone=timezone+resultLine;
      }
      print ("timezone is :"+timezone);
      //store the value
      /Devices/DemoServers_Servers/LocalTimeZone->setStringValue(timezone);
   }  catch (e) {             
	print("error in script: \n"+e.stack);
 }
 
incomingValue;