zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    润乾V4导出TXT时自定义分隔符
    aix系统下的websphere的静默安装
    润乾V4报表放入WEBINF保护目录下如何实现
    初创公司谁来当你们的运维
    无密码身份验证:安全、简单且部署快速
    ASP .NET 如何在 SQL 查询层面实现分页
    世界那么大,你要去看看!
    你真的知道如何定义性能要求么?
    node-firefox 二三事
    轻轻修改配置文件完成 OpenStack 监控
  • 原文地址:https://www.cnblogs.com/yezhaohui/p/3642782.html
Copyright © 2011-2022 走看看