LoadRunner中执行命令行

    在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样,但是system()有个缺陷:无法获取命令的返回结果。

    也许可以用`echo command > file`将结果输出到文件,然后再读出来。多痛苦的一件事啊!当虚拟用户多的时候,还得考虑重复写同一个文件存在的风险。或是将文件名进行参数化以保证不同相同的文件,但这样又加大了IO的负载。

    更好的解决办法是使用popen(), popen()用法上类似于fopen(),但不需要打开文件,直接读取数据流。全内存操作,不需要考虑文件覆盖,更不存在磁盘IO。

举例如下:

 1 #define BUFFER_SIZE 10240 // 初始给10KB 
 2 Action(){ 
 3     long fp; // 流的指针 
 4     int count; // 流的长度 
 5     char buffer[BUFFER_SIZE]; // 给输出分配内存空间 
 6     /* 
 7      * 下来我们来获取当前系统的用户名称 
 8      */ 
 9     fp = popen("echo %USERDOMAIN%", "r"); 
10     if (fp == NULL) { 
11         lr_error_message("命令执行失败"); 
12         return -1; 
13     } 
14     count = fread(buffer, sizeof(char), BUFFER_SIZE, fp); // 读取返回数据 
15     if (feof(fp) == 0) { 
16         lr_error_message("请给流分配更多的内存空间,谢谢!"); 
17         return -1; 
18     } 
19     if (ferror(fp)) { 
20         lr_error_message ("流读取失败"); 
21         return -1; 
22     } 
23     buffer[count] = NULL; 
24     lr_output_message("Notify:当前用户: %s", buffer); 
25     pclose(fp); 
26     return 0; 
27 }

输出:

Running Vuser... 
Starting iteration 1. 
Starting action Action. 
Action.c(28): Notify:当前用户: higkoo 
Ending action Action. 
Ending iteration 1. 
Ending Vuser...

逐行获取结果并逐行输出例子:

 1 extern char* strtok(char *token, const char *delimiter); // 提前申明 
 2 #define BUFFER_SIZE 20480 // 初始给它20 KB先 
 3 Action(){ 
 4     long fp; // 流指针 
 5     int count; //流长度 
 6     char buffer[BUFFER_SIZE]; // 给流分配内存 
 7     char * token; 
 8     char param_buf[10]; // 用于保存参数名称 
 9     int i; 
10     /* 
11      * 显示已安装设备驱动程序列表 
12      */ 
13     fp = popen("DRIVERQUERY", "r"); 
14     if (fp == NULL) { 
15         lr_error_message("命令执行失败"); 
16         return -1; 
17     } 
18     count = fread(buffer, sizeof(char), BUFFER_SIZE, fp); // 拿返回结果 
19     if (feof(fp) == 0) { 
20         lr_error_message("返回值过多,请加大流长度"); 
21         return -1; 
22     } 
23     if (ferror(fp)) { 
24         lr_error_message ("结果读取失败"); 
25         return -1; 
26     } 
27     buffer[count] = NULL; 
28     token = (char*) strtok(buffer, "
"); // 按换行符分割 
29     if (token == NULL) { 
30         lr_error_message ("返回值里没有换行"); 
31         return -1; 
32     } 
33     i = 1; 
34     while (token != NULL) { // 逐行的读结果 
35         sprintf(param_buf, "output_%d", i); 
36         lr_save_string(token, param_buf); 
37         i++; 
38         token = (char*) strtok(NULL, "
"); 
39     } 
40     lr_save_int(i-1, "output_count"); 
41     for (i=1; i<=lr_paramarr_len("output"); i++) {// 把所有行都打出来 
42         lr_output_message("设备信息: %s", lr_paramarr_idx("output", i)); 
43     } 
44     pclose(fp); 
45     return 0; 
46 }
原文地址:https://www.cnblogs.com/yezhaohui/p/3642782.html