天软金融分析.NET函数大全 > TSL函数 > 资源访问函数 > 进程相关函数

SysExec定义二    

简述
创建子进程执行操作系统命令。在指定目录下使用指定文件执行指定命令。指定目录可以为nil;指定命令可以为字符串,比如”py -V”,也可以为数组,比如array(“py”,”-V”)。
注:本定义方式功能只在新一代客户端版本中支持。
旧版本中用户请参考函数原定义说明:FAQ:SysExec
另外,关于code中返回的退出码(返回码),即为子进程终止时通过SysTerminate传递出来的退出码,当无此命令时,默认为0。
定义
Sysexec(
prog:String,
cmdline:array of string | string,
startupdir:string | nil,
wait:boolean | array(“wait”:Boolean,”in”:string),
var code:Integer | array(“code”:Integer,”out”:string)
[,waitms:Integer]): Integer
参数
名称类型说明
progString字符串,执行命令的文件所在路径。
cmdlineString字符串或数组,命令行命令。 例如:tsl abcd.tsl,也可以分割的数组,例如array(“tsl”,”abcd.tsl”)
StartupdirStringNIL或字符串,执行命令时所处的目录路径。
WaitBoolean布尔值或数组,是否阻塞执行。 当为数组时,“wait”下标对应的值表示是否等待,不存在则缺省为不等待,而” in”下标为进程的标准输入的输入信息信息。 注:当存在输入串时,必须是在已存在创建好的管道的前提条件下,否则会报错。
CodeArray,TableArray数值或数组,输出参数,进程的退出码。当存在管道输出且采用阻塞方式运行进程时, code为数组,下标”code”为返回码,”out”下标是运行的进程的标准输出里输入的内容。 另,在阻塞模式下,当等待超时的情况下,也还可以使用SysexecReadpipe读取后续输出的信息。
Waitmsinteger正整数,可选参数,等待阻塞的毫秒数。
返回值integer数值,进程句柄。
  • 范例:
    范例01:阻塞方式调用子进程执行命令
    path:="D:\\Program Files\\Python\\Python38\\python.exe";
    //创建管道
    ret:= Sysexecnewpipe();
    //创建成功,执行命令:获取python的版本号
    If ret then handle:=SysExec(path, "py -V",nil, true,code,5000);
    else return false;
    return code;

    //结果:


    范例02:调用子进程执行TSL语言脚本
    主程序代码
    path := "D:\\Program Files\\AnalyseNG.NET\\TSL.exe";
    filepath := "D:\\test\\csv\\test.tsl";
    //创建管道
    ret := Sysexecnewpipe();
    //创建成功,执行TSL语言脚本
    If ret then handle := SysExec(path,"tsl "$filepath,nil,true,code,5000);
    else return false;
    return code; 

    test.tsl代码
    data := array((1,2,3),(4,5,6),(7,8,9));
    ret := ExportFile(ftxls(),"","D:\\test\\csv\\test.xlsx",data);
    //导出成功,返回码为1
    if ret=1 then
    begin
      echo "ExportFile Success";
      systerminate(1);
    end else
    begin
      echo "ExportFile Fail:"$ret;
      //导出成功,返回码为0
      systerminate(0);
    end
    return; 

    //结果:

    //导出文件内容:


    范例03:非阻塞方式下执行命令并获取输出内容
    path:="D:\\Program Files\\Python\\Python38\\python.exe";
    //创建管道
    ret:= Sysexecnewpipe();
    //创建成功,执行命令:获取python的版本号
    if ret then handle:=SysExec(path,"py -V",nil,false,code);
    else return false;
    //循环获取执行后的输出内容
    t1:= "";
    while t1="" do
    begin
    t1:= SysexecReadpipe(handle);
    sleep(100);//等待100毫秒
    end
    SysTerminate(code, handle);//终止进程
    return t1;

    返回结果:


    范例04:非阻塞模式下通过”in”与管道输入串
      //创建读写管道
    SysexecNewpipe(0);
    path:="D:\\TinySoftNG\\AnalyseNG.NET\\TSL.exe";
    //非阻塞执行,返回进程句柄,并输入命令a:="abc",'\r\n'表示回车功能
    hand:= SysExec(path,"tsl",nil,array('wait':0,'in':'a:="abc"\r\n'),code);
    //向SysExec进程所在管道写入内容
    SysexecWritepipe(hand,"datetostr(20221130T)\r\n");
    sleep(500); //等待'in'传入的命令执行完成
    //向管道写入获取变量a的值
    SysexecWritepipe(hand,"a\r\n");
    //获取SysExec进程所在管道的输出内容
    t1:= "";
    while t1="" do
    begin
      t1:= SysexecReadpipe(hand);
      sleep(100); //100毫秒读取一次
    end
    SysTerminate(code,hand);//终止进程
    return t1;

    返回:
相关