在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 }