Move runtime and document pages into their correct scope, remove obsolete pending entries, and regenerate the function index.\nUpdate agent test guidance and API skill routing to match the new reference layout.
24 KiB
Builtin - 资源 / 进程
sleep(milliseconds)
暂停执行。
| 参数 | 类型 | 说明 |
|---|---|---|
milliseconds |
integer | 整数,需要暂停的毫秒数。例如暂停一秒为Sleep(1000)。 |
返回:nil
示例
// 以下代码先打印123,接着回暂停2S,然后接着打印456
echo 123;
sleep(2000);
echo 456;
sysParamStr(index)
获得命令行的指定索引的参数值。
| 参数 | 类型 | 说明 |
|---|---|---|
index |
整数,命令行参数的索引号。Index=0,返回值为当前天软脚本文件名称;Index>0,返回值为额外传入的命令行参数值(字符串类型) |
返回:string
示例
// 本地test.tsl文件中代码如下:
test();
function test();
begin
r := array();
for i := 1 to sysParamcount() do
begin
echo sysParamStr(i), '\r\n';
end
end
// 在cmd中打开文件所在文件夹,输入命令:tsl test.tsl 1 2 3
sysReleaseMutex(mutex)
释放一个互斥锁。
| 参数 | 类型 | 说明 |
|---|---|---|
mutex |
integer | 整数,互斥锁编号 |
返回:bool
示例
// 释放互斥锁,参数为创建互斥锁时返回的互斥锁编号
ret := rdo2 sysCreateMutex("tinysoft");
ret1 := rdo2 sysReleaseMutex(ret);
return ret1;
// 输出:1
sysexecnewpipe(flag)
创建Sysexec进程的管道。参数缺省时,默认创建读写管道。创建之后会与第一次被用的进程进行绑定,当有多个Sysexec进程时,可以创建多个管道分别进行读写操作。
| 参数 | 类型 | 说明 |
|---|---|---|
flag |
integer | 整数,可选参数,控制创建管道的读写属性。Flag转换为二进制时,第0位表示是否可读,第1位表示是否可写。即 |
返回:bool
示例
// 创建读写管道
sysExecNewPipe(0);
path := "D:\\TinySoftNG\\AnalyseNG.NET\\TSL.exe";
// 非阻塞执行,返回进程句柄
hand := sysExec(path, "tsl", nil, 0, code);
// 获取SysExec进程所在管道的输出内容
t1 := "";
while t1="" do
begin
t1 := sysexecreadpipe(hand);
sleep(100); // 100毫秒读取一次
end
// 向SysExec进程所在管道写入内容
sysExecWritePipe(hand, "datetostr(today())\r\n");
sleep(500); // 等待写入的内容执行完成,也可写成上面的循环的方式获取
// 获取管道执行写入内容后的输出内容
t2 := sysexecreadpipe(hand);
t3 := sysTerminate(code, hand); // 终止进程
return array(hand, t1, t2);
// 输出:如下图:
sysexecdeletepipe(process_handle)
删除指定进程的管道。参数缺省时,删除默认管道。
| 参数 | 类型 | 说明 |
|---|---|---|
process_handle |
数值,可选参数,进程句柄。 |
返回:bool
示例
// 创建读写管道
sysExecNewPipe(0);
path := "D:\\Program Files\\Analyse.NET\\TSL.exe";
// 非阻塞执行,返回进程句柄
hand := sysExec(path, "tsl", nil, false, code);
// 获取SysExec进程所在管道的输出内容
t1 := "";
while t1="" do
begin
t1 := sysexecreadpipe(hand);
end
de_ret := sysExecDeletePipe(hand);
// 删除成功,尝试向指定进程所在管道写入内容
if de_ret then
begin
try
sysExecWritePipe(hand, " datetostr(20221130T)\r\n");
return false;
except
// 写入失败,管道删除成功
return true;
end;
end
sysTerminate(code, hand); // 终止进程
return false;
// 输出:
// 执行超时。
sysGetSubProcesses(pid)
获得进程的子进程列表
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,可选参数,进程ID。未指定时默认获取当前进程内的子进程列表 |
返回:array,tablearray
示例
范例01:获取当前进程的子进程列表
ret := sysGetSubProcesses();
if istabel(ret) then
return ret;
else
return "获取进程的子进程列表失败!"
范例02:获取指定进程的子进程列表
// 打开记事本,在任务管理器中查找对应进程ID:
ret := sysGetSubProcesses(2932);
if istabel(ret) then
return ret;
else
return "获取进程的子进程列表失败!"
sysputenv(env_value)
设置当前运行环境的指定环境变量的值。
| 参数 | 类型 | 说明 |
|---|---|---|
env_value |
string | 字符串,环境变量名=变量值。 |
返回:integer
示例
// 以笔者的电脑环境为例,来展示该函数的功能:
// 如图所示,本地现有名为OS的环境变量:
// 并且在powerShell等控制台中可以获取到:
// 在TSL执行环境中,我们可以使用SysGetenv函数获取指定环境变量,如下:
范例01:将原环境变量值替换为设置值。
// 从下面的截图中,可以看出,SysPutenv只能设置当前TSL运行环境的环境变量。
// 在客户端中用代码实现如下:
res := sysgetenv("OS"); // 获取本地原有环境变量OS的值
echo res; // 打印原有环境变量OS的值
ret := sysputenv("OS=Test"); // 更改当前运行环境的环境变量OS的值
if ret=0 then return sysgetenv("OS"); // 更改成功,获取更改后的环境变量OS的值
// 返回字符串“Test”
范例02:将新增值添加到原有环境变量中
// 在客户端中用代码实现如下:
res := sysgetenv("OS"); // 获取本地原有环境变量OS的值
echo res; // 打印原有环境变量OS的值
res := "OS="$res$";Test"; // 原有环境变量与设置值拼接
ret := sysputenv(res); // 更改当前运行环境的环境变量OS的值
if ret=0 then return sysgetenv("OS"); // 更改成功,获取更改后的环境变量OS的值
// 输出:返回字符串" Windows_NT;Test"
sysErrorMessage(code)
返回指定代码表示的系统错误信息。
| 参数 | 类型 | 说明 |
|---|---|---|
code |
integer | 整数,提示代码 |
返回:string
示例
return rdo2 sysErrorMessage(200);
// 输出:代码段不可大于或等于 64K。
sysgetenv(name)
获取当前运行环境下指定环境变量的值。
| 参数 | 类型 | 说明 |
|---|---|---|
name |
string | 字符串,环境变量名。 |
返回:string
示例
// 读取本地已有系统环境变量OS的值
return sysgetenv("OS");
// 返回字符串“Windows_NT”
// 注:更具体的应用可参考Sysputenv中的范例。
sysWaitForMultipleObjects(objects, b_wait_all, wait_ms)
等待占有多个对象,例如互斥对象。支持windows和linux的进程
| 参数 | 类型 | 说明 |
|---|---|---|
objects |
array of integer | 一维数字数组,对象句柄数组 |
b_wait_all |
bool | 真假,是否等待所有的对象。为真等待所有的,为假则仅需任意一个对象等待成功。 |
wait_ms |
integer | 整数,等待的毫秒数,-1则为永远等待。 |
返回:integer
示例
sysExecNewPipe(); // 创建管道
path := "D:\\TinySoftNG\\AnalyseNG.NET\\TSL.exe";
do_s1 := array('C:\\TinySoftNG\\AnalyseNG.NET\\tsl.exe', 'C:\\DoTSL\\otherTest\\TestEnv.tsl');
do_s2 := array('C:\\TinySoftNG\\AnalyseNG.NET\\tsl.exe', 'C:\\DoTSL\\otherTest\\TestEcho.tsf');
// 创建一个被挂起的进程,两个会返回的进程
hand1 := sysExec(path, 'TSL', nil, array('wait': false, 'in': 'c := "333"\r\n'), code);
hand2 := sysExec(path, do_s1, nil, false, code);
hand3 := sysExec(path, do_s2, nil, false, code);
r := sysWaitForMultipleObjects(array(hand1, hand2, hand3), 0, 10 * 1000); // 仅需任意一个对象等待成功
t := sysexecreadpipe(); // 读取管道内容
sysTerminate(code, hand1); // 终止进程
sysTerminate(code, hand2); // 终止进程
sysTerminate(code, hand3); // 终止进程
return array(r, t);
返回: 返回为1,说明hand1没有等待成功,而至少hand2是有等待成功了。注:其中的TestEnv.tsl与TestEcho.tsf实现分别如下:TestEnv.tsl: sleep(500);t := Sysgetenvs();echo "sys: ", tostn(t), '\r\n';return 1;
test_echo.tsf: sleep(2 * 1000); // 停2秒echo 'TestEchoIN\r\n';return 1;
sysCreateMutex(mutex_name)
创建一个互斥锁。
| 参数 | 类型 | 说明 |
|---|---|---|
mutex_name |
string | 字符串,互斥锁名称 |
返回:integer
示例
// 创建一个名称为tinysoft的互斥锁
ret := rdo2 sysCreateMutex("tinysoft");
return ret;
// 输出:2632
sysProcessId()
获得运行的进程ID。
返回:integer
示例
{获得天软客户端程序当前的进程ID,即在任务管理器中查看到的进程对应的PID。每个电脑的进程不一样}
return rdo2 sysProcessId();
sysParamcount()
获得命令行参数个数。(不包括执行的自身.TSL参数)
返回:integer
示例
// 本地test.tsl文件中代码如下:
test();
function test();
begin
// 获取命令行传入参数个数
echo sysParamcount();
end
// 在cmd中打开文件所在文件夹,输入命令:tsl test.tsl 1 2 3
sysThreadId()
获得运行的线程ID。
返回:integer
示例
// 获得天软客户端程序当前的进程运行的线程ID
return rdo2 sysThreadId();
sysWaitForSingleObject(object, wait_ms)
等待占有一个对象,例如互斥对象。支持windows和linux的进程
| 参数 | 类型 | 说明 |
|---|---|---|
object |
integer | 整数,对象名柄 |
wait_ms |
integer | 整数,等待的毫秒数,-1则为永远等待。 |
返回:integer
示例
sysExecNewPipe(); // 创建管道
path := "D:\\TinySoftNG\\AnalyseNG.NET\\TSL.exe";
do_s := array('C:\\TinySoftNG\\AnalyseNG.NET\\tsl.exe', 'C:\\DoTSL\\otherTest\\TestEnv.tsl');
hand1 := sysExec(path, do_s, nil, array('wait': false, 'in': 'd := "123"\r\n'), code);
r := sysWaitForSingleObject(hand1, 10 * 1000); // 等待线程的状态
t := sysexecreadpipe(); // 读取管道内容
return array(r, t);
返回: 其中,TestEnv.tsl文件的实现如下: // 当前sys的环境变量t := Sysgetenvs();echo "sys: ",tostn(t),'\r\n';s := Readln();//读取echo 'IN:',s,'\r\n';return 1;
sysGetenvs()
获取当前运行环境的全部环境变量串。
返回:array of string
示例
// 读取当前运行环境的所有环境变量
return sysGetenvs();
// 部分结果截图:
sysexecGetenvs()
获取子进程的环境变量,应用于Sysexec创建的子进程。
返回:array of string
示例
sysExecSetEnvs(array("test=test", "test1=test1"), 2);
return sysexecGetenvs();
// 输出:
// array("test=test","test1=test1","ALLUSERSPROFILE=C:\\ProgramData","APPDATA=C:\\Users\\cobia\\AppData\\Roaming","CODEX_CI=1","CODEX_MANAGED_BY_NPM=1","CODEX_MANAGED_PACKAGE_ROOT=...
// 注:更多应用可参考Sysexecsetenvs
dbglocalcancel(id)
注销任务。该功能可以用来终止运行的WEB任务。
| 参数 | 类型 | 说明 |
|---|---|---|
id |
integer | 为dbglocalrunning中返回信息中的id字段以十六进制模式转换为64位整数 |
返回:bool
sysThreadSelf()
获取当前程序的线程ID。
返回:integer|int64
示例
// 在客户端中,本地执行如下代码:
return sysThreadSelf();
// 返回值:线程ID,如11000
// 通过cmd查看天软客户端进程与线程,结果如下:
syslinuxkrnlclosemutex(name, isprivate)
支持在LINUX上手动删除掉因互斥支持产生的系统信号量以及临时目录的文件
| 参数 | 类型 | 说明 |
|---|---|---|
name |
string | 字符串,互斥锁名称 |
isprivate |
bool | 是否私有 |
返回:any
sysSetThreadPriority(pri, tid)
设置线程优先级
| 参数 | 类型 | 说明 |
|---|---|---|
pri |
integer | 线程优先级 |
tid |
integer | 可选参数,线程ID。未指定时默认设置当前线程优先级 |
返回:integer
示例
范例01:设置当前线程优先级
ret := sysSetThreadPriority(1);
if ret=0 then
return 1;
else
return "设置线程优先级失败!";
// 输出:返回1,设置成功。
范例02:设置指定线程优先级
// 创建函数指针
c := makeinstance(thisfunction(func_pos), "cdecl", 1);
// 创建线程
handle := CreateThread(nil, 10240000, c, nil, 0, tid);
ret := sysSetThreadPriority(1, tid);
if ret=0 then
return 1;
else
return "设置线程优先级失败!";
// 定义WindowsAPI的CreateThread函数声明。
function CreateThread(attr: pointer;size: pointer;addr: pointer;p: pointer;flag: integer;var threadid: integer): pointer;external "kernel32.dll" name "CreateThread";
// 自定义函数,用于创建函数指针
function FuncPos(p: pointer): integer;
begin
sleep(random(3000));
return 1;
end;
// 输出:返回1,设置成功。
sysGetThreadPriority(pri, tid)
获取线程优先级
| 参数 | 类型 | 说明 |
|---|---|---|
pri |
integer | 变参,整数,线程优先级 |
tid |
integer | 整数,可选参数,线程ID。未指定时默认获取当前线程优先级 |
返回:integer
示例
范例01:获取当前线程优先级
ret := sysGetThreadPriority(pri);
if ret=0 then
return pri;
else
return "获取线程优先级失败!";
范例02:获取指定线程优先级
tid := 18024; // 指定线程ID
ret := sysGetThreadPriority(pri, tid);
if ret=0 then
return pri;
else
return "获取线程优先级失败!";
sysGetThreadName(tid)
获取线程名称
| 参数 | 类型 | 说明 |
|---|---|---|
tid |
integer | 整数,可选参数,线程ID。未指定时默认获取当前线程名称 |
返回:string
示例
范例01:获取当前线程名称
ret := sysGetThreadName();
if ret then
return ret;
else
return "获取线程名称失败!";
范例02:获取指定线程名称
tid := 18024; // 指定线程ID
ret := sysGetThreadName(tid);
if ret then
return ret;
else
return "获取线程名称失败!";
sysGetThreads(pid)
获取进程内的线程列表
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,可选参数,进程ID。未指定时默认获取当前进程内的线程列表 |
返回:array,tablearray
示例
范例01:获取当前进程内的线程列表
ret := sysGetThreads();
return ret;
// 输出:
// array(52412,37192,19952,47976,46252,25228,13360,24792,33176)
范例02:获取指定进程内的线程列表
// 打开记事本,在任务管理器中查找对应进程ID:
ret := sysGetThreads(2932);
return ret;
// 输出:
// array()
sysPPid(pid)
获得进程的父进程ID
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,可选参数,进程ID。未指定时默认获取当前进程的父进程ID |
返回:integer
示例
范例01:获取当前进程的父进程ID
ret := sysPPid();
if ret then
return ret;
else
return "获取进程的父进程ID失败!";
范例02:获取指定进程的父进程ID
// 打开记事本,在任务管理器中查找对应进程ID:
ret := sysPPid(28848);
if ret then
return ret;
else
return "获取进程的父进程ID失败!";
// 输出:
// 无输出。
sysPidOfTid(tid)
获取线程所属进程ID
| 参数 | 类型 | 说明 |
|---|---|---|
tid |
integer | 整数,线程ID |
返回:integer
示例
范例01:获取当前线程所属进程
tid := sysThreadId(); // 获取当前线程ID
ret := sysPidOfTid(tid);
if ret then
return ret;
else
return "获取线程所属进程ID失败!"
sysPidOfHandle(handle)
根据进程句柄获取进程ID。在Linux上,返回和进程句柄值相同的整数
| 参数 | 类型 | 说明 |
|---|---|---|
handle |
integer | 进程句柄 |
返回:integer
示例
范例01:根据进程句柄获取进程ID
// TSL解析器路径
path := "D:\\Program Files\\AnalyseNG.NET\\TSL.exe";
// 创建管道
ret := sysExecNewPipe();
// 创建一个TSL解析器进程
if ret then
handle := sysExec(path, "TSL", nil, 0, code); // 返回进程句柄
ret := sysPidOfHandle(handle);
sysTerminate(rc, handle); // 关闭TSL解析器进程
if ret then
return ret;
else
return "根据进程句柄获取进程ID失败!"
sysHandleOfPid(pid, rights, inherithandle)
Windows上获取进程id对应的句柄,Linux上获取指定文件ID的复制ID。得到的句柄可用函数FAQ:SysCloseHandle进行关闭。
| 参数 | 类型 | 说明 |
|---|---|---|
pid |
integer | 整数,进程ID |
rights |
integer | 整数,可选参数,设置进程句柄权限,Linux上无效。常见的权限设置值见下表。 |
inherithandle |
integer | 布尔值,可选参数,是否继承,Linux上无效 |
常见权限值:
| 值 | 十进制值 | 访问权限 | 可操作范围 |
|---|---|---|---|
0x0010 |
16 | PROCESS_VM_READ | 读取进程内存内容 |
0x0400 |
1024 | PROCESS_QUERY_INFORMATION | 查询完整进程信息(令牌、优先级等) |
0x1000 |
4096 | PROCESS_QUERY_LIMITED_INFORMATION(缺省值) | 仅查询进程基础信息(PID、退出代码等) |
0xFFFF |
65535 | PROCESS_ALL_ACCESS | 所有权限(包括终止、内存写入等) |
返回:integer
sysGetLastError()
获得系统操作的最后一个返回代码。
返回:integer
sysCmdLine()
获得解析器的真实命令行串。
返回:string
sysTerminate(ret_code, handle)
终止进程。
| 参数 | 类型 | 说明 |
|---|---|---|
ret_code |
integer | 整数,终止进程返回的代码。 |
handle |
integer | 整数,终止进程的句柄。缺省为终止自身进程。 |
返回:any
sysCloseHandle(handle)
关闭一个句柄,如互斥锁,文件句柄等。
| 参数 | 类型 | 说明 |
|---|---|---|
handle |
integer | 整数,句柄编号 |
返回:bool
示例
// 启动windows平台下的windows命令处理程序,然后关闭启动该程序时返回的句柄
tool_path := "C:\\Program Files\\Windows Media Player";
ret := rdo2 sysExec(tool_path+"\\wmplayer.exe", "D:\\test1\\when_ever.mp3", tool_path, 1, returncode);
ret1 := rdo2 sysCloseHandle(ret);
return ret1;
// 输出:1
dbglocalrunning()
获得当前所有的任务列表以及堆栈信息,主要用于web等检查在运行中的任务。
返回:array,tablearray
示例
// 在本地脚本中运行下面代码:
t := dbglocalrunning();
echo toStn(t);
return 1;
// 打印信息如下:
array(
("StartInfo":
("id": "000001b9b8e30440", "info": "C:\\Users\\xxxxx\\Tinysoft\\Analyse.NET\\editer\\cmpCachesnewfile\\new12.tsl", "createtm": 45602.6995526042), "CallStack":
(
("NAME": "__main__", "USER": "local", "LINE": 3))))
sysGetProcessList()
获取当前进程列表信息
返回:array,tablearray
示例
ret := sysGetProcessList();
if ret<>0 then
return ret;
else
return "当前进程列表信息失败!";
// 部分结果如下:
sysGetProcessListw()
获取当前进程列表信息,信息中字符串为宽字节字符串
返回:array,tablearray
示例
ret := sysGetProcessListw();
if ret<>0 then
return ret;
else
return "当前进程列表信息失败!";
// 部分结果如下:
sysGetWndOfCaption(cap, is_contain_string)
获得所有标题窗口串包含或者等于指定串的所有窗口句柄。
| 参数 | 类型 | 说明 |
|---|---|---|
cap |
string | 字符串,窗口的标题。 |
is_contain_string |
布尔类型,是否包含,可选参数参数,默认是包含。 |
返回:array of hwnd
示例
// 获取标题是”test.docx”的窗口句柄。
v := sysGetWndOfCaption("test.docx");
echo v;
sysGetPidtidOfWnd(wnd, thread_id)
获得窗口句柄的进程ID, 通过ThreadId可输出线程id
| 参数 | 类型 | 说明 |
|---|---|---|
wnd |
hwnd | 整型,窗口句柄。 |
thread_id |
integer | 输出值,整型,线程号,给定该参数可以获取线程ID。 |
返回:integer
示例
// 获取标题是”test.docx”的窗口的word的进程ID。
// 获取标题是”test.docx”的窗口句柄
wnd := sysGetWndOfCaption("test.docx");
// 通过窗口句柄获得进程ID
v := sysGetPidtidOfWnd(wnd[0]);
echo v;
sysSetThreadName(name, tid)
设置线程名称
| 参数 | 类型 | 说明 |
|---|---|---|
name |
string | 字符串,要设置的名称 |
tid |
integer | 整数,可选参数,线程ID。未指定时默认设置当前线程名称 |
返回:integer
示例
范例01:设置当前线程名称
ret := sysSetThreadName("TinySoft");
if ret=0 then
return 1;
else
return "设置线程名称失败!";
// 输出:返回1,设置成功。
范例02:设置指定线程名称
// 创建函数指针
c := makeinstance(thisfunction(func_pos), "cdecl", 1);
// 创建线程
handle := CreateThread(nil, 10240000, c, nil, 0, tid);
ret := sysSetThreadName("TinySoft", tid);
if ret=0 then
return 1;
else
return "设置线程名称失败!";
// 定义WindowsAPI的CreateThread函数声明。
function CreateThread(attr: pointer;size: pointer;addr: pointer;p: pointer;flag: integer;var threadid: integer): pointer;external "kernel32.dll" name "CreateThread";
// 自定义函数,用于创建函数指针
function FuncPos(p: pointer): integer;
begin
sleep(random(3000));
return 1;
end;
// 输出:返回1,设置成功。