精华内容
下载资源
问答
  • Bro脚本语法5-指令(Directives)

    千次阅读 2016-10-26 17:21:02
    Bro脚本语法5-指令(Directives)@(教程)[Bro]Bro 脚本语言指令的概念有点类似于C语言中的宏,他会在脚本执行之前对脚本进行处理,比如哪些脚本会被加载,脚本中的哪几行会被执行等等,哪些指令展开后得到特定的字符...

    Bro脚本语法5-指令(Directives)

    @(教程)[Bro]

    Bro 脚本语言指令的概念有点类似于C语言中的宏,他会在脚本执行之前对脚本进行处理,比如哪些脚本会被加载,脚本中的哪几行会被执行等等,哪些指令展开后得到特定的字符串等等

    @DEBUG
    TODO

    @DIR
    当前脚本的路径
    Example:

    print "Directory:", @DIR;

    @FILENAME
    文件名或当前的脚本

    Example:

    print "File:", @FILENAME;

    @load
    从脚本文件搜索路径加载脚本。如果文件名以.bro结尾,可以不加扩展名(不能有空格)

    例子中 Bro 会加载脚本 “policy/misc/capture-loss.bro”(BROPATH 环境变量中搜索):

    @load policy/misc/capture-loss

    如果@load后面是个路径而不是文件名,则会查找路径中的load.bro脚本

    这样的话就避免了加载的时候加载不全,也避免了写一大推的@load语句

    @load-plugin
    通过插件名启用一个插件搜索路径(BRO_PLUGIN_PATH)中的动态插件

    @load-plugin Demo::Rot13

    默认情况下,bro 会自动启用所有能用的插件,在bro 模式下(bro -b),插件必须通过这个指令手动启动,或者在命令行中指定

    bro Demo::Rot13

    或者通过设置环境变量 * BRO_PLUGIN_ACTIVATE* 来启用

    @load-sigs
    类似与load,不过载入的是一个签名(signature)文件,如果文件是以.sig结尾的,可以省略扩展名,
    例子中 Bro will 将加载签名文件 “base/protocols/ssl/dpd.sig”:

    @load-sigs base/protocols/ssl/dpd

    文件的格式参考 Signature Framework 的文档

    @unload
    指定不载入某个脚本,如果这个脚本已经被载入了,那这个语句将不起作用,如果没被载入,那以后的载入语句也都将不起作用
    例子: 如果 “policy/misc/capture-loss.bro” 还没被载入, 那么Bro将不会载入这个脚本

    @unload policy/misc/capture-loss

    @prefixes
    在自动搜索加载脚本的时候指定脚本前缀
    指定前缀

    @prefixes = cluster

    增加一个前缀

    @prefixes += cluster-manager

    Bro会自动加载相关的脚本
    策略是去掉路径名,前面加上一个点,在再前面加上一个prefixes,然后搜索并加载这个文件
    比如 bro 加载了一个 local.bro的脚本,同时指定了一个test的prefiex前缀,那么bro将会搜索并加载 test.local.bro的脚本

    在命令行中可以通过 -p 来指定

    @if
    @if
    @else
    @endif
    三个搭配使用,要求是bool表达式
    Example:

    @if ( ver == 2 )
        print "version 2 detected";
    @endif

    @ifdef
    不做解释了
    Example:

    @ifdef ( pi )
        print "pi is defined";
    @endif

    @ifndef
    Example:

    @ifndef ( pi )
        print "pi is not defined";
    @endif

    @else
    搭配 “@if”, “@ifdef”, or “@ifndef”. 的可选项
    Example:

    @ifdef ( pi )
        print "pi is defined";
    @else
        print "pi is not defined";
    @endif

    @endif
    搭配 “@if”, “@ifdef”, or “@ifndef”. 的必选项

    展开全文
  • 010editor脚本语法深入分析

    千次阅读 2017-04-01 00:40:07
    010editor是一款十六进制编辑器,和winhex相比支持更灵活的脚本语法,可以对文件、内存、磁盘进行操作 常用的模板库(*.bt)用于识别文件类型http://www.sweetscape.com/010editor/repository/templat

    转自:http://blog.csdn.net/lichao890427/article/details/51870347

    010editor是一款十六进制编辑器,和winhex相比支持更灵活的脚本语法,可以对文件、内存、磁盘进行操作

    常用的模板库(*.bt)用于识别文件类型http://www.sweetscape.com/010editor/repository/templates/

    文件类型:cab gzip rar zip cda midi mp3 ogg wav avi flv mp4 rm pdf iso vhd lnk dmp dex androidmanifest class

    其他:

        Drive.bt  解析mbr  fat16 fat43 hfs ntfs等

        elf.bt  解析Linux elf格式的文件

        exe.bt 解析windows pe x86/x64 格式文件(dll sys exe ...)

        macho.bt 解析mac os可执行文件

       registrayhive.bt 解析注册表(Hive)文件

       bson.bt 解析二进制json

    常用的脚本库(*.1sc)用于操作数据http://www.sweetscape.com/010editor/repository/scripts/

    二进制:

        CountBlocks.1sc 查找指定数据块

        DecodeBase64.1sc 解码base64

        EncodeBase64.1sc 编码base64

        Entropy.1sc 计算熵

        JoinFIle.1sc SplitFile.1sc 分隔合并文件

        Js-unicode-escape.1sc  Js-unicode-unescape.1sc URLDecoder.1sc  js编码解码

    其他:

        CopyAsAsm.1sc CopyAsBinary.1sc CopyAsCpp.1sc CopyAsPython.1sc 复制到剪贴板

        DumpStrings.1sc 查找所有ascii unicode字符串


    脚本语言语法类似于c++,这种结构体不同之处在于:

           访问变量时,从文件读取并显示,赋值变量时,写入文件

           可以使用控制语句如if for while

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct FILE   
    2. {  
    3.     struct HEADER   
    4.     {  
    5.         char type[4];  
    6.         int version;  
    7.         int numRecords;  
    8.     } header;  
    9.     struct RECORD   
    10.     {  
    11.     int employeeId;  
    12.     char name[40];  
    13.     float salary;  
    14.     } record[ header.numRecords ];  
    15. } file;  

    控制语句实例:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. int i;  
    2. for( i = 0; i < file.header.numRecords; i++ )  
    3.  file.record[i].salary *= 2.0;  

    基本语法

    表达式

    变量

    数据类型

    控制语句

    函数

    关键字

    预处理

    语法限制


    表达式

    支持标准c的操作符:+ - * / ~ ^ & | % ++ -- ?: << >> ()

    支持的比较操作符:< ? <= >= == != !

    支持的赋值操作符:= += -= *= /= &= ^= %= |= <<= >>=

    布尔运算符:&& || !

    常数:     

        10进制 456

        16进制 0xff 25h 0EFh

        8进制 013

        2进制 0b011

        u后缀表示unsigned    L后缀表示8字节int64值   

        指数 1e10

        浮点数 2.0f 2.0


    变量

    定义脚本变量

    int x;
    float a = 3.5f;
    unsigned int myVar1, myVar2;

    常量

    const int TAG_EOF = 0x3545;

    内建常量:true false TRUE FALSE M_PI PI


    数据类型

    8字节 char byte CHAR BYTE uchar ubyte UCHAR UBYTE

    16字节 short int16 SHORT INT16 ushort uint16 USHORT UINT16 WORD

    32字节 int int32 long INT INT32 LONG uint uint32 ulong UINT UINT32 ULONG DWORD

    64字节 int64 quad QUAD INT64 __int64 uint64 uquad UQUAD UINT64 __uint64 QWORD

    浮点 float FLOAT double DOUBLE hfloat HFLOAT

    其他 DOSDATE DOSTIME FILETIME OLETIME time_t


    使用typedef

    typedef unsigned int myInt;

    typedef char myString[15];
    myString s = "Test";

    使用enum

    enum MYENUM { COMP_1, COMP_2 = 5, COMP_3 } var1;

    enum <ushort> MYENUM { COMP_1, COMP_2 = 5, COMP_3 } var1;

    数组和字符串

    int myArray[15];

    int myArray[ FileSize() - myInt * 0x10 + (17 << 5) ];//大小可以是变量

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. char str[15] = "First";  
    2. string s = "Second";  
    3. string r1 = str + s;  
    4. string r2 = str;  
    5. r2 += s;  
    6. return (r1 == r2);  

    宽字符

     

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. wchar_t str1[15] = L"How now";  
    2. wstring str2 = "brown cow";  
    3. wstring str3 = str1 + L' ' + str2 + L'?';  


    可以通过WStringToString StringToWString转换


    控制语句

    if语句

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. if( x < 5 )  
    2. x = 0;  
    3. or  
    4. if( y > x )  
    5. max = y;  
    6. else  
    7. {  
    8. max = x;  
    9. y = 0;  
    10. }  

    for语句

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. for( i = 0, x = 0; i < 15; i++ )  
    2. {  
    3. x += i;  
    4. }  

    while语句

     

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. while( myVar < 15 )  
    2. {  
    3. x *= myVar;  
    4. myVar += 2;  
    5. }  
    6. or  
    7. do  
    8. {  
    9. x *= myVar;  
    10. myVar += 2;  
    11. }  
    12. while( myVar < 23 );  


    switch语句

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. switch( <variable> )  
    2. {  
    3. case <expression>: <statement>; [break;]  
    4. .  
    5. .  
    6. .  
    7. default : <statement>;  
    8. }  
    9. switch( value )  
    10. {  
    11. case 2 : result = 1; break;  
    12. case 4 : result = 2; break;  
    13. case 8 : result = 3; break;  
    14. case 16 : result = 4; break;  
    15. default : result = -1;  
    16. }  


    循环控制:break continue return


    函数 

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. string str = "Apple";  
    2. return Strlen( str );  
    3.   
    4. Printf( "string='%s' length='%d'\n", str, Strlen( str ) );  
    5.   
    6. void OutputInt( int d )  
    7. {  
    8. Printf( "%d\n", d );  
    9. }  
    10. OutputInt( 5 );  
    11.   
    12. char[] GetExtension( char filename[], int &extLength )  
    13. {  
    14. int pos = Strchr( filename, '.' );  
    15. if( pos == -1 )  
    16. {  
    17. extLength = 0;  
    18. return "";  
    19. }  
    20. else  
    21. {  
    22. extLength = Strlen( filename ) - pos - 1;  
    23. return SubStr( filename, pos + 1 );  
    24. }  
    25. }  

    参数可以通过值或引用传递,010editor脚本不支持指针,但是可以用[]表示数组

    程序中不需要main函数,代码从第一行开始执行


    关键字

    sizeof      

    startof  用于计算变量起始地址

             SetCursorPos( startof( lines[0] ) );

    exists  检查某变量是否声明

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. int i;  
    2. string s;  
    3. while( exists( file[i] ) )  
    4. {  
    5. s = file[i].frFileName;  
    6. Printf( "%s\n", s );  
    7. i++;  
    8. }  

    function_exists 检查函数是否定义

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. if( function_exists(CopyStringToClipboard) )  
    2. {  
    3. ...  
    4. }  

    this 引用当前结构体 

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. void PrintHeader( struct HEADER &h )  
    2. {  
    3. Printf( "ID1 = %d\n", h.ID1 );  
    4. Printf( "ID2 = %d\n", h.ID2 );  
    5. }  
    6. struct HEADER  
    7. {  
    8. int ID1;  
    9. int ID2;  
    10. PrintHeader( this );  
    11. } h1;  

    parentof 访问包含变量的结构和union

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. void PrintHeader( struct HEADER &h )  
    2. {  
    3. Printf( "ID1 = %d\n", h.ID1 );  
    4. Printf( "ID2 = %d\n", h.ID2 );  
    5. }  
    6. struct HEADER  
    7. {  
    8. int ID1;  
    9. int ID2;  
    10. struct SUBITEM  
    11. {  
    12. int data1;  
    13. int data2;  
    14. PrintHeader( parentof(this) );  
    15. } item1;  
    16. PrintHeader( parentof(item1) );  
    17. } h1;  

    预处理

    define
    #define PI 3.14159265

    #define CHECK_VALUE if( value > 5) { \
    Printf( "Invalid value %d\n", value ); \
    Exit(-1); }

    #define FILE_ICON 12
    #define FOLDER_ICON (FILE_ICON+100)

    内建常量

    _010EDITOR  010editor运行后定义

    _010_WIN 运行在windows上定义

    _010_MAC

    _010_LINUX

    _010_64BIT

    条件编译

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #ifdef | #ifndef <constant_name>  
    2. (...)  
    3. [ #else ]  
    4. (...)  
    5. #endif  
    6. #ifndef CONSTANTS_H  
    7. #define CONSTANTS_H  

    警告和错误

     

    [html]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. #ifdef NUMBITS  
    2. value = value + NUMBITS;  
    3. #else  
    4. #warning "NUMBITS not defined!"  
    5. #endif  
    6.   
    7. #ifndef CURRENT_OS  
    8. #error "CURRENT_OS must be defined. Compilation stopped."  
    9. #endif  

    include

    #include "Vector.bt"


    脚本限制

    禁止使用指针,可以使用引用传参数

    禁止使用#if预处理

    禁止使用多维数组

    禁止使用goto


     模板基础

    声明模板变量

    数据类型

    结构体联合体

    array duplicate optimizing

    位域

    表达式

    控制语句

    函数

    关键字

    预处理

    include

    定制变量

    On-Demand结构体

    模板限制


    声明模板变量

    特殊属性

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. < format=hex|decimal|octal|binary,  
    2. fgcolor=<color>,  
    3. bgcolor=<color>,  
    4. comment="<string>"|<function_name>,  
    5. name="<string>"|<function_name>,  
    6. open=true|false|suppress,  
    7. hidden=true|false,  
    8. read=<function_name>,  
    9. write=<function_name>  
    10. size=<number>|<function_name> >  

    format 设置

    int crc <format=hex>;
    int flags <format=binary>;

    color设置

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. int id <fgcolor=cBlack, bgcolor=0x0000FF>;  
    2.   
    3. SetForeColor( cRed );  
    4. int first; // will be colored red  
    5. int second; // will be colored red  
    6. SetForeColor( cNone );  
    7. int third; // will not be colored  

    大小头端设置

    注释设置

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. int machineStatus <comment="This should be greater than 15.">;  
    2.   
    3. int machineStatus <comment=MachineStatusComment>;  
    4. string MachineStatusComment( int status )  
    5. {  
    6. if( status <= 15 )  
    7. return "*** Invalid machine status";  
    8.   
    9.   
    10. else  
    11. return "Valid machine status";  
    12. }  

    显示名设置

    byte _si8 <name="Signed Byte">;

    顺序:在声明模板变量后,当前文件指针后移,通过FTell获取当前位置,通过FSeek FSkip移动指针  通过ReadByte ReadShort ReadInt任意读取而不移动指针

    局部变量

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. local int i, total = 0;  
    2. int recordCounts[5];  
    3. for( i = 0; i < 5; i++ )  
    4. total += recordCounts[i];  
    5. double records[ total ];  

    打开状态设置

    <open=true/false>展开/收敛节点

     

    字符串

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. char str[];  
    2. string str;  
    3. wchar_t str[];  
    4. wstring str;  

    隐藏设置

    <hidden=true/false> 


    结构体联合体

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. struct myStruct {  
    2. int a;  
    3. int b;  
    4. int c;  
    5. };  
    6.   
    7. struct myStruct {  
    8. int a;  
    9. int b;  
    10. int c;  
    11. } s1, s2;  
    12.   
    13. struct myIfStruct {  
    14. int a;  
    15. if( a > 5 )  
    16. int b;  
    17. else  
    18. int c;  
    19. } s;  
    20.   
    21. struct {  
    22. int width;  
    23. struct COLOR {  
    24. uchar r, g, b;  
    25. } colors[width];  
    26. } line1;  
    27.   
    28. typedef struct {  
    29. ushort id;  
    30. int size;  
    31. }  
    32. myData;  
    33.   
    34. union myUnion {  
    35. ushort s;  
    36. double d;  
    37. int i;  
    38. } u;  
    39.   
    40. //带参数结构体  
    41. struct VarSizeStruct (int arraySize)  
    42. {  
    43. int id;  
    44. int array[arraySize];  
    45. };  
    46.   
    47. typedef struct (int arraySize)  
    48. {  
    49. int id;  
    50. int array[arraySize];  
    51. } VarSizeStruct;  
    52. VarSizeStruct s1(5);  
    53. VarSizeStruct s2(7);  

    array, duplicate, optimizing

    010editor允许重复模板变量

    int x;/x[0]
    int y;
    int x;//x[1]

    local int i;
    for( i = 0; i < 5; i++ )
    int x;//x[0-5]

    010editor默认认为结构体大小一致,这样生成大量结构体数组的速度较快,若实际结构体大小不一致则可能产生问题,此时用optimize=false,如下例:

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. typedef struct {  
    2. int id;  
    3. int length;  
    4. uchar data[ length ];  
    5. } RECORD;  
    6. RECORD record[5] <optimize=false>;  

    位域

    int alpha : 5;
    int : 12;
    int beta : 15;

    enum <ushort> ENUM1 { VAL1_1=25, VAL1_2=29, VAL1_3=7 } var1 : 12;
    enum <ushort> ENUM2 { VAL2_1=5, VAL2_2=6 } var2 : 4;


    用户变量

    指定如何显示和修改数据

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. typedef ushort FIXEDPT <read=FIXEDPTRead, write=FIXEDPTWrite>;  
    2. string FIXEDPTRead( FIXEDPT f )  
    3. {  
    4. string s;  
    5. SPrintf( s, "%lg", f / 256.0 );  
    6. return s;  
    7. }  
    8. void FIXEDPTWrite( FIXEDPT &f, string s )  
    9. {  
    10. f = (FIXEDPT)( Atof( s ) * 256 );  
    11. }  
    12.   
    13. typedef float VEC3F[3] <read=Vec3FRead, write=Vec3FWrite>;  
    14. string Vec3FRead( VEC3F v )  
    15. {  
    16. string s;  
    17. SPrintf( s, "(%f %f %f)", v[0], v[1], v[2] );  
    18. return s;  
    19. }  
    20. void Vec3FWrite( VEC3F &v, string s )  
    21. {  
    22. SScanf( s, "(%f %f %f)", v[0], v[1], v[2] );  
    23. }  

    On-Demand结构体

    通过指定size解决大量变量消耗内存问题

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. typedef struct  
    2. {  
    3. int header;  
    4. int value1;  
    5. int value2;  
    6. } MyStruct <size=12>;  
    7.   
    8. typedef struct {  
    9. <...>  
    10. uint frCompressedSize;  
    11. uint frUncompressedSize;  
    12. ushort frFileNameLength;  
    13. ushort frExtraFieldLength;  
    14. if( frFileNameLength > 0 )  
    15. char frFileName[ frFileNameLength ];  
    16. if( frExtraFieldLength > 0 )  
    17. uchar frExtraField[ frExtraFieldLength ];  
    18. if( frCompressedSize > 0 )  
    19. uchar frData[ frCompressedSize ];  
    20. } ZIPFILERECORD <size=SizeZIPFILERECORD>;  
    21. int SizeZIPFILERECORD( ZIPFILERECORD &r )  
    22. {  
    23. return 30 + // base size of the struct  
    24. ReadUInt(startof(r)+18) + // size of the compressed data  
    25. ReadUShort(startof(r)+26) + // size of the file name  
    26. ReadUShort(startof(r)+28); // size of the extra field  
    27. }  


    模板限制

    禁止多维数组

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. typedef struct  
    2.  {  
    3.  float row[4];  
    4.  }  
    5.  MATRIX[4];  
    6.   
    7.  MATRIX m;  

    接口函数

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. //书签  
    2. void AddBookmark( int64 pos, string name, string typenameint arraySize=-1, int forecolor=cNone, int backcolor=0xffffc4, int moveWithCursor=false )  
    3. AddBookmark( GetCursorPos(), "endmarker","ZIPENDLOCATOR", -1, cRed );  
    4. int GetBookmarkArraySize( int index )  
    5. int GetBookmarkBackColor( int index )  
    6. int GetBookmarkForeColor( int index )  
    7. int GetBookmarkMoveWithCursor( int index )  
    8. string GetBookmarkName( int index )  
    9. int64 GetBookmarkPos( int index )  
    10. string GetBookmarkType( int index )  
    11. int GetNumBookmarks()  
    12. void RemoveBookmark( int index )  
    13. //断言  
    14. void Assert( int value, const char msg[] = "" )  
    15. Assert( numRecords > 10,"numRecords should be more than 10." );  
    16. //剪贴板  
    17. void ClearClipboard()  
    18. void CopyBytesToClipboard( uchar buffer[], int size, int charset=CHARSET_ANSI, int bigendian=false )  
    19. void CopyStringToClipboard( const char str[], int charset=CHARSET_ANSI )  
    20. void CopyToClipboard()  
    21. void CutToClipboard()  
    22. int GetClipboardBytes( uchar buffer[], int maxBytes )  
    23. int GetClipboardIndex()  
    24. string GetClipboardString()  
    25. void PasteFromClipboard()  
    26. int SetClipboardIndex( int index )  
    27.   
    28. 文件  
    29. int DeleteFile( char filename[] )    //删除文件,文件不能在编辑器中打开  
    30. void FileClose()//关闭当前文件  
    31. int FileCount()//获取editor打开的文件数  
    32. int FileExists( const char filename[] )//检测文件存在  
    33. int FileNew( char interface[]=""int makeActive=true )//创建爱你文件  
    34. int FileOpen( const char filename[], int runTemplate=falsechar interface[]=""int openDuplicate=false )//打开文件  
    35. int FileSave()   
    36. int FileSave( const char filename[] )   
    37. int FileSave( const wchar_t filename[] )   
    38. int FileSaveRange( const char filename[], int64 start, int64 size )   
    39. int FileSaveRange( const wchar_t filename[], int64 start, int64 size )//保存文件  
    40. void FileSelect( int index )//选择读写的文件  
    41. int FindOpenFile( const char path[] )   
    42. int FindOpenFileW( const wchar_t path[] )//查找并打开文件  
    43. int GetFileAttributesUnix()  
    44. int GetFileAttributesWin()  
    45. int SetFileAttributesUnix( int attributes )  
    46. int SetFileAttributesWin( int attributes )  
    47. int GetFileCharSet()  
    48. char[] GetFileInterface()  
    49. int SetFileInterface( const char name[] )  
    50. char[] GetFileName()  
    51. wchar_t[] GetFileNameW()  
    52. int GetFileNum()  
    53. int GetReadOnly()  
    54. int SetReadOnly( int readonly )  
    55. string GetTempDirectory()  
    56. char[] GetTempFileName()  
    57. char[] GetTemplateName()   
    58. wchar_t[] GetTemplateNameW()  
    59. char[] GetTemplateFileName()   
    60. wchar_t[] GetTemplateFileNameW()  
    61. char[] GetScriptName()   
    62. wchar_t[] GetScriptNameW()  
    63. char[] GetScriptFileName()   
    64. wchar_t[] GetScriptFileNameW()  
    65. char[] GetWorkingDirectory()   
    66. wchar_t[] GetWorkingDirectoryW()  
    67. int RenameFile( const char originalname[], const char newname[] )  
    68. void RequiresFile()  
    69. void RequiresVersion( int majorVer, int minorVer=0, int revision=0 )  
    70. void RunTemplate( const char filename[]=""int clearOutput=false )  
    71. int SetWorkingDirectory( const char dir[] )   
    72. int SetWorkingDirectoryW( const wchar_t dir[] )  
    73.   
    74. //输入  
    75. char[] InputDirectory( const char title[], const char defaultDir[]="" )  
    76. double InputFloat( const char title[], const char caption[], const char defaultValue[] )  
    77. int InputNumber( const char title[], const char caption[], const char defaultValue[] )  
    78. char[] InputOpenFileName( char title[], char filter[]="All files (*.*)"char filename[]="" )  
    79. TOpenFileNames InputOpenFileNames( char title[], char filter[]="All files (*.*)"char filename[]="" )  
    80.     int i;  
    81.     TOpenFileNames f = InputOpenFileNames(  
    82.     "Open File Test",  
    83.     "C Files (*.c *.cpp)|All Files (*.*)" );  
    84.     for( i = 0; i < f.count; i++ )  
    85.     Printf( "%s\n", f.file[i].filename );  
    86. int InputRadioButtonBox( const char title[], const char caption[], int defaultIndex, const char str1[], const char str2[], const char str3[]=""const char str4[]=""const char str5[]=""const char str6[]=""const char str7[]=""const char str8[]=""const char str9[]=""const char str10[]=""const char str11[]=""const char str12[]=""const char str13[]=""const char str14[]=""const char str15[]="" )  
    87. char[] InputSaveFileName( char title[], char filter[]="All files (*.*)"char filename[]=""char extension[]="" )  
    88. char[] InputString( const char title[], const char caption[], const char defaultValue[] )  
    89. wstring InputWString( const char title[], const char caption[], const wstring defaultValue )  
    90. int InsertFile( const char filename[], int64 position )  
    91. int IsEditorFocused()  
    92. int IsModified()  
    93. int IsNoUIMode()  
    94. int MessageBox( int mask, const char title[], const char format[] [, argument, ... ] )  
    95. void OutputPaneClear()  
    96. int OutputPaneSave( const char filename[] )  
    97. void OutputPaneCopy()  
    98. int Printf( const char format[] [, argument, ... ] )  
    99.     Printf( "Num = %d, Float = %lf, Str = '%s'\n", 15, 5, "Test" );  
    100. void StatusMessage( const char format[] [, argument, ... ] )  
    101.   
    102.   
    103. int64 GetSelSize()  
    104. int64 GetSelStart()  
    105. void SetSelection( int64 start, int64 size )  
    106.   
    107. //颜色  
    108. int GetForeColor()  
    109. int GetBackColor()  
    110. void SetBackColor( int color )   
    111. void SetColor( int forecolor, int backcolor )   
    112. void SetForeColor( int color )  
    113.   
    114. int GetBytesPerLine()//获取显示列数  
    115.   
    116. //时间  
    117. string GetCurrentTime( char format[] = "hh:mm:ss" )  
    118. string GetCurrentDate( char format[] = "MM/dd/yyyy" )  
    119. string GetCurrentDateTime( char format[] = "MM/dd/yyyy hh:mm:ss" )  
    120.   
    121. void DisableUndo()//禁止undo  
    122. void EnableUndo()//允许undo  
    123.   
    124. //设置显示值  
    125. void DisplayFormatBinary()   
    126. void DisplayFormatDecimal()   
    127. void DisplayFormatHex()   
    128. void DisplayFormatOctal()  
    129.   
    130. int Exec( const char program[], const char arguments[], int wait=false ) int Exec( const char program[], const char arguments[], int wait, int &errorCode )  
    131. void Exit( int errorcode )  
    132. void Warning( const char format[] [, argument, ... ] )  
    133. void Terminate( int force=true )  
    134. char[] GetArg( int index ) wchar_t[] GetArgW( int index )//获取传递给脚本的命令  
    135. char[] GetEnv( const char str[] )//获取环境变量  
    136. int SetEnv( const char str[], const char value[] )  
    137. int GetNumArgs()  
    138.   
    139. void ExpandAll()//展开节点  
    140. void ExportCSV( const char filename[] )//导出  
    141. void ExportXML( const char filename[] )//导出  
    142.   
    143. int64 GetCursorPos()//获取当前指针  
    144. void SetCursorPos( int64 pos )  
    145. void Sleep( int milliseconds )  


    I/O函数

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. void BigEndian()//设置大小头端  
    2. int IsBigEndian()  
    3. int IsLittleEndian()  
    4. void LittleEndian()  
    5.   
    6. double ConvertBytesToDouble( uchar byteArray[] ) //数据转换  
    7. float ConvertBytesToFloat( uchar byteArray[] )   
    8. hfloat ConvertBytesToHFloat( uchar byteArray[] )  
    9. int ConvertDataToBytes( data_type value, uchar byteArray[] )  
    10. void DeleteBytes( int64 start, int64 size )//删除数据  
    11. void InsertBytes( int64 start, int64 size, uchar value=0 )//插入数据  
    12. void OverwriteBytes( int64 start, int64 size, uchar value=0 )  
    13.   
    14. char ReadByte( int64 pos=FTell() ) //读取数据  
    15. double ReadDouble( int64 pos=FTell() )   
    16. float ReadFloat( int64 pos=FTell() )   
    17. hfloat ReadHFloat( int64 pos=FTell() )   
    18. int ReadInt( int64 pos=FTell() )   
    19. int64 ReadInt64( int64 pos=FTell() )   
    20. int64 ReadQuad( int64 pos=FTell() )   
    21. short ReadShort( int64 pos=FTell() )  
    22. uchar ReadUByte( int64 pos=FTell() )   
    23. uint ReadUInt( int64 pos=FTell() )   
    24. uint64 ReadUInt64( int64 pos=FTell() )   
    25. uint64 ReadUQuad( int64 pos=FTell() )   
    26. ushort ReadUShort( int64 pos=FTell() )  
    27. void ReadBytes( uchar buffer[], int64 pos, int n )  
    28. char[] ReadString( int64 pos, int maxLen=-1 )  
    29. int ReadStringLength( int64 pos, int maxLen=-1 )  
    30. wstring ReadWString( int64 pos, int maxLen=-1 )  
    31. int ReadWStringLength( int64 pos, int maxLen=-1 )  
    32. wstring ReadWLine( int64 pos, int maxLen=-1 )  
    33. char[] ReadLine( int64 pos, int maxLen=-1, int includeLinefeeds=true )  
    34.   
    35. void WriteByte( int64 pos, char value ) //写入数据  
    36. void WriteDouble( int64 pos, double value )   
    37. void WriteFloat( int64 pos, float value )   
    38. void WriteHFloat( int64 pos, float value )   
    39. void WriteInt( int64 pos, int value )   
    40. void WriteInt64( int64 pos, int64 value )   
    41. void WriteQuad( int64 pos, int64 value )   
    42. void WriteShort( int64 pos, short value )   
    43. void WriteUByte( int64 pos, uchar value )   
    44. void WriteUInt( int64 pos, uint value )   
    45. void WriteUInt64( int64 pos, uint64 value )   
    46. void WriteUQuad( int64 pos, uint64 value )   
    47. void WriteUShort( int64 pos, ushort value )  
    48. void WriteBytes( const uchar buffer[], int64 pos, int n )  
    49. void WriteString( int64 pos, const char value[] )  
    50. void WriteWString( int64 pos, const wstring value )  
    51.   
    52. int DirectoryExists( string dir )  
    53. int MakeDir( string dir )  
    54. int FEof()  
    55. int64 FileSize()  
    56. TFileList FindFiles( string dir, string filter )  
    57.     TFileList fl = FindFiles( "C:\\temp\\", "*.zip" );  
    58.     int i;  
    59.     Printf( "Num files = %d\n", fl.filecount );  
    60.     for( i = 0; i < fl.filecount; i++ )  
    61.     {  
    62.     Printf( " %s\n", fl.file[i].filename );  
    63.     }  
    64.     Printf( "\n" );  
    65.     Printf( "Num dirs = %d\n", fl.dircount );  
    66.     for( i = 0; i < fl.dircount; i++ )  
    67.     {  
    68.     Printf( " %s\n", fl.dir[i].dirname );  
    69.     }  
    70. int FPrintf( int fileNum, char format[], ... )  
    71. int FSeek( int64 pos )  
    72. int FSkip( int64 offset )  
    73. int64 FTell()  
    74.   
    75. int64 TextAddressToLine( int64 address )  
    76. int TextAddressToColumn( int64 address )  
    77. int64 TextColumnToAddress( int64 line, int column )  
    78. int64 TextGetNumLines()  
    79. int TextGetLineSize( int64 line, int includeLinefeeds=true )  
    80. int64 TextLineToAddress( int64 line )  
    81. int TextReadLine( char buffer[], int64 line, int maxsize, int includeLinefeeds=true )  
    82. int TextReadLineW( wchar_t buffer[], int64 line, int maxsize, int includeLinefeeds=true )  
    83. void TextWriteLineW( const wchar_t buffer[], int64 line, int includeLinefeeds=true )  
    84. void TextWriteLine( const char buffer[], int64 line, int includeLinefeeds=true )  

    字符串函数

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. //类型转换  
    2. double Atof( const char s[] )  
    3. int Atoi( const char s[] )  
    4. int64 BinaryStrToInt( const char s[] )  
    5.     return BinaryStrToInt( "01001101" );  
    6. char[] ConvertString( const char src[], int srcCharSet, int destCharSet )  
    7.     CHARSET_ASCII CHARSET_ANSI CHARSET_OEM CHARSET_EBCDIC CHARSET_UNICODE CHARSET_MAC CHARSET_ARABIC CHARSET_BALTIC CHARSET_CHINESE_S CHARSET_CHINESE_T CHARSET_CYRILLIC CHARSET_EASTEUROPE CHARSET_GREEK CHARSET_HEBREW CHARSET_JAPANESE CHARSET_KOREAN_J CHARSET_KOREAN_W CHARSET_THAI CHARSET_TURKISH CHARSET_VIETNAMESE CHARSET_UTF8  
    8. string DosDateToString( DOSDATE d, char format[] = "MM/dd/yyyy" )  
    9. string DosTimeToString( DOSTIME t, char format[] = "hh:mm:ss" )  
    10. string EnumToString( enum e )  
    11. string FileTimeToString( FILETIME ft, char format[] = "MM/dd/yyyy hh:mm:ss" )  
    12.     int hour, minute, second, day, month, year;  
    13.     string s = FileTimeToString( ft );  
    14.     SScanf( s, "%02d/%02d/%04d %02d:%02d:%02d",  
    15.     month, day, year, hour, minute, second );  
    16.     year++;  
    17.     SPrintf( s, "%02d/%02d/%04d %02d:%02d:%02d",  
    18.     month, day, year, hour, minute, second );  
    19. int StringToDosDate( string s, DOSDATE &d, char format[] = "MM/dd/yyyy" )  
    20. int StringToDosTime( string s, DOSTIME &t, char format[] = "hh:mm:ss" )  
    21. int StringToFileTime( string s, FILETIME &ft, char format[] = "MM/dd/yyyy hh:mm:ss" )  
    22. int StringToOleTime( string s, OLETIME &ot, char format[] = "MM/dd/yyyy hh:mm:ss" )  
    23. int StringToTimeT( string s, time_t &t, char format[] = "MM/dd/yyyy hh:mm:ss" )  
    24. char[] StringToUTF8( const char src[], int srcCharSet=CHARSET_ANSI )  
    25. wstring StringToWString( const char str[], int srcCharSet=CHARSET_ANSI )  
    26.   
    27. //内存操作  
    28. int Memcmp( const uchar s1[], const uchar s2[], int n )  
    29. void Memcpy( uchar dest[], const uchar src[], int n, int destOffset=0, int srcOffset=0 )  
    30. void Memset( uchar s[], int c, int n )  
    31. string OleTimeToString( OLETIME ot, char format[] = "MM/dd/yyyy hh:mm:ss" )  
    32. int RegExMatch( string str, string regex ); //正则匹配  
    33. int RegExMatchW( wstring str, wstring regex );  
    34. int RegExSearch( string str, string regex, int &matchSize, int startPos=0 );   
    35. int RegExSearchW( wstring str, wstring regex, int &matchSize, int startPos=0 );  
    36.     if( RegExMatch( "test@test.ca",  
    37.     "\\b[A-Za-z0-9.%_+\\-]+@[A-Za-z0-9.\\-]+\\.[A-Za-z]{2,4}\\b" )  
    38.     == false )  
    39.     {  
    40.     Warning( "Invalid email address" );  
    41.     return -1;  
    42.     }  
    43.     int result, size;  
    44.     result = RegExSearch(  
    45.     "12:03:23 AM - 192.168.0.10 : www.sweetscape.com/",  
    46.     "\\d{1,3}\\.\\d{1,3}.\\d{1,3}.\\d{1,3}", size );  
    47.     Printf( "Match at pos %d of size %d\n", result, size );  
    48. void Strcat( char dest[], const char src[] )  
    49. int Strchr( const char s[], char c )  
    50. int Strcmp( const char s1[], const char s2[] )   
    51. void Strcpy( char dest[], const char src[] )  
    52. char[] StrDel( const char str[], int start, int count )   
    53. int Stricmp( const char s1[], const char s2[] )  
    54. int Strlen( const char s[] )  
    55. int Strncmp( const char s1[], const char s2[], int n )  
    56. void Strncpy( char dest[], const char src[], int n )   
    57. int Strnicmp( const char s1[], const char s2[], int n )  
    58. int Strstr( const char s1[], const char s2[] )  
    59. char[] SubStr( const char str[], int start, int count=-1 )  
    60. string TimeTToString( time_t t, char format[] = "MM/dd/yyyy hh:mm:ss" )  
    61. char ToLower( char c ) wchar_t ToLowerW( wchar_t c )  
    62. char ToUpper( char c ) wchar_t ToUpperW( wchar_t c )  
    63. void WMemcmp( const wchar_t s1[], const wchar_t s2[], int n )  
    64. void WMemcpy( wchar_t dest[], const wchar_t src[], int n, int destOffset=0, int srcOffset=0 )  
    65. void WMemset( wchar_t s[], int c, int n )  
    66. void WStrcat( wchar_t dest[], const wchar_t src[] )  
    67. int WStrchr( const wchar_t s[], wchar_t c )  
    68. int WStrcmp( const wchar_t s1[], const wchar_t s2[] )  
    69. void WStrcpy( wchar_t dest[], const wchar_t src[] )  
    70. wchar_t[] WStrDel( const whar_t str[], int start, int count )   
    71. int WStricmp( const wchar_t s1[], const wchar_t s2[] )  
    72. char[] WStringToString( const wchar_t str[], int destCharSet=CHARSET_ANSI )  
    73. char[] WStringToUTF8( const wchar_t str[] )  
    74. int WStrlen( const wchar_t s[] )  
    75. int WStrncmp( const wchar_t s1[], const wchar_t s2[], int n )  
    76. void WStrncpy( wchar_t dest[], const wchar_t src[], int n )  
    77. int WStrnicmp( const wchar_t s1[], const wchar_t s2[], int n )   
    78. int WStrstr( const wchar_t s1[], const wchar_t s2[] )  
    79. wchar_t[] WSubStr( const wchar_t str[], int start, int count=-1 )  
    80.   
    81. char[] FileNameGetBase( const char path[], int includeExtension=true ) //获取文件名  
    82. wchar_t[] FileNameGetBaseW( const wchar_t path[], int includeExtension=true )  
    83. char[] FileNameGetExtension( const char path[] )   
    84. wchar_t[] FileNameGetExtensionW( const wchar_t path[] )  
    85. char[] FileNameGetPath( const char path[], int includeSlash=true )   
    86. wchar_t[] FileNameGetPathW( const wchar_t path[], int includeSlash=true )  
    87. char[] FileNameSetExtension( const char path[], const char extension[] )   
    88. wchar_t[] FileNameSetExtensionW( const wchar_t path[], const wchar_t extension[] )   
    89.   
    90. //格式化字符串  
    91. int SPrintf( char buffer[], const char format[] [, argument, ... ] )  
    92. int SScanf( char str[], char format[], ... )  

    数学函数

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. double Abs( double x )  
    2. double Ceil( double x )  
    3. double Cos( double a )  
    4. double Exp( double x )  
    5. double Floor( double x)  
    6. double Log( double x )  
    7. double Max( double a, double b )  
    8. double Min( double a, double b)  
    9. double Pow( double x, double y)  
    10. int Random( int maximum )  
    11. double Sin( double a )  
    12. double Sqrt( double x )  
    13. data_type SwapBytes( data_type x )  
    14. double Tan( double a )  

    工具函数

    [cpp]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. //计算校验和  
    2. int64 Checksum( int algorithm, int64 start=0, int64 size=0, int64 crcPolynomial=-1, int64 crcInitValue=-1 )  
    3.     CHECKSUM_BYTE CHECKSUM_SHORT_LE CHECKSUM_SHORT_BE CHECKSUM_INT_LE CHECKSUM_INT_BE CHECKSUM_INT64_LE CHECKSUM_INT64_BE CHECKSUM_SUM8 CHECKSUM_SUM16 CHECKSUM_SUM32 CHECKSUM_SUM64 CHECKSUM_CRC16 CHECKSUM_CRCCCITT CHECKSUM_CRC32 CHECKSUM_ADLER32  
    4. int ChecksumAlgArrayStr( int algorithm, char result[], uchar *buffer, int64 size, char ignore[]="", int64 crcPolynomial=-1, int64 crcInitValue=-1 )  
    5. int ChecksumAlgArrayBytes( int algorithm, uchar result[], uchar *buffer, int64 size, char ignore[]="", int64 crcPolynomial=-1, int64 crcInitValue=-1 )  
    6. int ChecksumAlgStr( int algorithm, char result[], int64 start=0, int64 size=0, char ignore[]="", int64 crcPolynomial=-1, int64 crcInitValue=-1 )  
    7. int ChecksumAlgBytes( int algorithm, uchar result[], int64 start=0, int64 size=0, char ignore[]="", int64 crcPolynomial=-1, int64 crcInitValue=-1 )  
    8.   
    9. //查找比较  
    10. TCompareResults Compare( int type, int fileNumA, int fileNumB, int64 startA=0, int64 sizeA=0, int64 startB=0, int64 sizeB=0, int matchcase=true, int64 maxlookahead=10000, int64 minmatchlength=8, int64 quickmatch=512 )  
    11.     int i, f1, f2;  
    12.     FileOpen( "C:\\temp\\test1" );  
    13.     f1 = GetFileNum();  
    14.     FileOpen( "C:\\temp\\test2" );  
    15.     f2 = GetFileNum();  
    16.     TCompareResults r = Compare( COMPARE_SYNCHRONIZE, f1, f2 );  
    17.     for( i = 0; i < r.count; i++ )  
    18.     {  
    19.     Printf( "%d %Ld %Ld %Ld %Ld\n",  
    20.     r.record[i].type,  
    21.     r.record[i].startA,  
    22.     r.record[i].sizeA,  
    23.     r.record[i].startB,  
    24.     r.record[i].sizeB );  
    25.     }  
    26. TFindResults FindAll( <datatype> data, int matchcase=trueint wholeword=falseint method=0, double tolerance=0.0, int dir=1, int64 start=0, int64 size=0, int wildcardMatchLength=24 )  
    27.     int i;  
    28.     TFindResults r = FindAll( "Test" );  
    29.     Printf( "%d\n", r.count );  
    30.     for( i = 0; i < r.count; i++ )  
    31.     Printf( "%Ld %Ld\n", r.start[i], r.size[i] );  
    32. int64 FindFirst( <datatype> data, int matchcase=trueint wholeword=falseint method=0, double tolerance=0.0, int dir=1, int64 start=0, int64 size=0, int wildcardMatchLength=24 )  
    33. TFindInFilesResults FindInFiles( <datatype> data, char dir[], char mask[], int subdirs=trueint openfiles=falseint matchcase=trueint wholeword=falseint method=0, double tolerance=0.0, int wildcardMatchLength=24 )  
    34.     int i, j;  
    35.     TFindInFilesResults r = FindInFiles( "PK",  
    36.     "C:\\temp""*.zip" );  
    37.     Printf( "%d\n", r.count );  
    38.     for( i = 0; i < r.count; i++ )  
    39.     {  
    40.     Printf( " %s\n", r.file[i].filename );  
    41.     Printf( " %d\n", r.file[i].count );  
    42.     for( j = 0; j < r.file[i].count; j++ )  
    43.     Printf( " %Ld %Ld\n",  
    44.     r.file[i].start[j],  
    45.     r.file[i].size[j] );  
    46.     }  
    47. int64 FindNext( int dir=1 )  
    48. TFindStringsResults FindStrings( int minStringLength, int type, int matchingCharTypes, wstring customChars="", int64 start=0, int64 size=0, int requireNull=false )  
    49.     TFindStringsResults r = FindStrings( 5, FINDSTRING_ASCII,  
    50.     FINDSTRING_LETTERS | FINDSTRING_CUSTOM, "$&" );  
    51.     Printf( "%d\n", r.count );  
    52.     for( i = 0; i < r.count; i++ )  
    53.     Printf( "%Ld %Ld %d\n", r.start[i], r.size[i], r.type[i] );  
    54.       
    55. //类型转换  
    56. char ConvertASCIIToEBCDIC( char ascii )  
    57. void ConvertASCIIToUNICODE( int len, const char ascii[], ubyte unicode[], int bigendian=false )  
    58. void ConvertASCIIToUNICODEW( int len, const char ascii[], ushort unicode[] )   
    59. char ConvertEBCDICToASCII( char ebcdic )  
    60. void ConvertUNICODEToASCII( int len, const ubyte unicode[], char ascii[], int bigendian=false )  
    61. void ConvertUNICODEToASCIIW( int len, const ushort unicode[], char ascii[] )  
    62.   
    63. int ExportFile( int type, char filename[], int64 start=0, int64 size=0, int64 startaddress=0,int bytesperrow=16, int wordaddresses=0 )  
    64. int ImportFile( int type, char filename[], int wordaddresses=falseint defaultByteValue=-1 )  
    65. int GetSectorSize()   
    66. int HexOperation( int operation, int64 start, int64 size, operand, step=0, int64 skip=0 )  
    67. int64 Histogram( int64 start, int64 size, int64 result[256] )  
    68. int IsDrive()  
    69. int IsLogicalDrive()  
    70. int IsPhysicalDrive()  
    71. int IsProcess()  
    72. int OpenLogicalDrive( char driveletter )  
    73. int OpenPhysicalDrive( int physicalID )  
    74. int OpenProcessById( int processID, int openwriteable=true )  
    75. int OpenProcessByName( char processname[], int openwriteable=true )  
    76. int ReplaceAll( <datatype> finddata, <datatype> replacedata, int matchcase=trueint wholeword=falseint method=0, double tolerance=0.0, int dir=1, int64 start=0, int64 size=0, int padwithzeros=falseint wildcardMatchLength=24 )  

    另附本人写的binxml.bt,可以解析apk中的AndroidManifest.xml resource.arsc /res/*.xml


    展开全文
  • Postman Script 脚本语法总结

    千次阅读 2019-01-26 21:31:15
    Postman的强大之处在于其允许在对某一个request访问的之前和之后分别运行自定义的一段Javascript脚本,这样直接就完成了一个chain request的效果,可以将数条request连结成一个流程完成一体化测试。这在很多的API...
    Postman的强大之处在于其允许在对某一个request访问的之前和之后分别运行自定义的一段Javascript脚本,这样直接就完成了一个 chain request的效果,可以将数条request连结成一个流程完成一体化测试。这在很多的API操作中都是极其有用的,所以这里有必要总结一些常用语句。

    参考Postman官方:Intro to scripts

    Script workflow 脚本执行流程

    image

    • pre-request脚本,是在对API进行请求之前的脚本,一般用于动态生成参数、JSON数据包、链接地址等。
    • test脚本,其实更应该叫post-request,实在完成API访问并得到其response回应之后运行的脚本,一般用于获取response的内容,用于之后对于别的资源的请求,如获取页面标题和内容等。

    Requirements 运行脚本要求

    需要注意,pre-request脚本,在里面直接写代码就可以了,但是test脚本需要在某个指定的函数pm.test(...)中执行才会被识别,且作为test脚本运行。如下图:
    image
    pm.test()中第一个参数是测试描述(会在测试结果栏显示,应和其它测试描述做以区分),第二个参数是一个函数,具体执行代码都在这个函数中运行。
    另外,pm对象是Postman的主要对象,所有的内置函数,数据调用等,都需要通过它来实现。

    Code Snippets 常用语句

    一般会在脚本编写栏的右边都会有常用语句片段,点击以下就会出来代码,但是一开始不太了解的话点出来其实也看不懂。如下图:
    image

    官方文档解释的各种函数调用链接在这里:Postman Sandbox

    以下是我自己总结的常用代码片段:

    // 获取response返回内容
    var rsb = responseBody; // 是字符串格式
    
    // 获取环境变量
    var v = pm.environment.get("变量名称");
    
    // 设置环境变量 只能存储字符串,如果是对象的话则无法在下次运行时获取到内容
    // 如需要存储JSON数据,可以用JSON.stringify(..)存储,再用JSON.parse(..)转化为对象使用
    pm.environment.set("变量名称", 变量内容);
    
    // 清除某个环境变量
    pm.environment.unset("环境变量名");
    
    // 获取全局变量和普通变量
    var gb = pm.globals.get("全局变量名");
    var nm = pm.variables.get("普通变量名");
    
    // Javascript 获取变量类型
    console.log( typeof pm.enviroment );

    Pre-request Script 预处理脚本

    Pre-request script是在request之前准备request信息用的脚本。

    参考Postman官方:Pre-request scripts

    常用的准备工作有:

    • 读取环境变量,再放到request body或headers中。
    • 拼接组合提交request请求所需要的参数,比如authentication code。

    常用的语句如下:

    // 获取环境变量
    var v = pm.environment.get("变量名称");
    
    // 设置环境变量 只能存储字符串,如果是对象的话则无法在下次运行时获取到内容
    // 如需要存储JSON数据,可以用JSON.stringify(..)存储,再用JSON.parse(..)转化为对象使用
    pm.environment.set("变量名称", 变量内容);

    Test Script 测试脚本

    测试脚本是在request之后,对Response的返回值进行下一步处理的脚本。

    参考Postman官方:Test scripts
    参考Postman官方:Test examples

    常用的处理有:

    • 读取response回复的数据,存为环境变量
    • 根据response回复的状态成功与否,判断下一步做什么

    常用的语句如下:

    // 获取response headers中某一个值
    ctype = postman.getResponseHeader("Content-Type");
    
    // 获取response body的全部内容
    text = pm.response.text();
    
    // 获取response返回的全部JSON
    json_data = pm.response.json();
    
    // 获取json中某一个值,比如name的值:
    myName = json_data.name;

    Test Result 测试结果

    除了上面的具体功能代码外,经常还需要返回一个结果,告诉Postman这个测试结果是Pass还是Fail,默认是pass。

    这里返回值就不是简单的return语句可以,必须要通过Postman自带的对象或方法才可以,一般是通过pm.expect()tests[]这两个地方返回测试结果。

    完整的测试示范:

    // 测试response的状态是否是200成功:
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });

    这些方法名看起来都很容易理解,一般都会叫pm.expect().to.be().to.have()这样的,字面意思就是期待什么或要求它必须是什么或必须有什么,才能通过测试。
    另外,同样的测试结果,实际上还有更简单的写法,即不通过pm对象,而是内置tests对象。

    常用操作如下:

    # 反应时间必须少于200毫秒
    tests["Response time is less than 200ms"] = responseTime < 200;
    
    # 判断反应代号是否等于某一个指定的代号
    tests["Status code name has string"] = responseCode.name.has("Created");

    看这个用法,猜测tests是一个JSON格式的对象,tests[...]括号内的字符串是测试的描述, =后面是判断语句,然后将True或False赋予为tests[..]的值,然后postman轮训所有tests对象里的参数,并返回pass与否的结果。

    这里是官方总结的常用测试脚本方法:Test examples

    以下是我总结的常用的返回测试结果的内置函数:

    # “期待”返回结果必须包含某一段内容
    pm.expect(从response里获取的字符串).to.include("必须包含的内容");
    
    # 返回body值必须完全等于某一段内容
    pm.response.to.have.body("必须等于的内容");
    
    # 反应时间必须少于200毫秒
    pm.expect(pm.response.responseTime).to.be.below(200);
    
    # 必须返回某一个状态 如"Created"
    pm.response.to.have.status("状态名");
    

    image

    Debugging 脚本调试

    如果要看已经设置的Enviroment变量的话,可以点开右上方小眼睛看到,如下图,我设置了3个环境变量:
    image

    调试时要打印的话,一般都是用console.log(...),这样就能在console中看到:

    • 如果你的Postman是Chrome app的话,直接在chrome浏览器的开发者工具里调试就行。
    • 如果是Mac等桌面软件,则需要打开内置的console才能看到调试信息。

    位置在左下角,如下图:
    image

    Postman Sandbox

    Postman的Sandbox是Postman内部默认引入的第三方JS库。

    参考:Postman Sandbox 官方脚本可引用库说明
    参考:Postman Sandbox API 官方引用的脚本库详解

    Sandbox引用的第三方库有:

    image

    生成MD5字符串:

    var hashed = CryptoJS.MD5("待加密的字符串");

    文件转base64字符串:

    s = 'Hello';
    // 先转化成UTF-8编码的字符串
    utf8 = CryptoJS.enc.Utf8.parse( s );
    // 用CryptoJS第三方库(Postman已经内置了)进行编码
    b64 = CryptoJS.enc.Base64.stringify(utf8)
    
    console.log(b64);
    // aGVsbG8=

    Postman SDK

    不同于Sandbox,这是Postman内部较高级的SDK,可以引用一些方便的方法。

    参考官方网址:Tutorial: Postman SDK Concepts

    URL转换成JSON格式,并获取指定的参数值:

    var sdk = require('postman-collection');
    query = ( new sdk.Url(callback) ).toJSON().query;
    
    for (var i in query) {
        console.log(query[i].key +": "+ query[i].value);
    }
    展开全文
  • Postman 快速入门之脚本语法

    千次阅读 2020-06-03 12:02:44
    Postman的强大之处在于其允许在对某一个request访问的之前和之后分别运行自定义的一段Javascript脚本,这样直接就完成了一个chain request的效果,可以将数条request连结成一个流程完成一体化测试。这在很多的API...

    Postman是访问各种API的客户端。它的强大之处在于其允许在对某一个request访问的之前和之后分别运行自定义的一段Javascript脚本,这样直接就完成了一个chain request的效果,可以将数条request连结成一个流程完成一体化测试。这在很多的API操作中都是极其有用的,所以这里有必要总结一些常用语句。

    参考postman官方:Intro to scripts

    Script workflow 脚本执行流程

    在这里插入图片描述
    collection pre-request script -> folder pre-request script -> request pre-request script -> collection test -> folder test script -> request pre-request test

    • pre-request脚本,是在对API进行请求之前的脚本,一般用于动态生成参数、JSON数据包、链接地址等。
    • test脚本,其实更应该叫post-request,实在完成API访问并得到其response回应之后运行的脚本,一般用于获取response的内容,用于之后对于别的资源的请求,如获取页面标题和内容等。

    Requirements 运行脚本要求

    需要注意,pre-request脚本,在里面直接写代码就可以了,但是test脚本需要在某个指定的函数pm.test(…)中执行才会被识别,且作为test脚本运行。如下图:
    在这里插入图片描述
    pm.test()中第一个参数是测试描述(会在测试结果栏显示,应和其它测试描述做以区分),第二个参数是一个函数,具体执行代码都在这个函数中运行。
    另外,pm对象是Postman的主要对象,所有的内置函数,数据调用等,都需要通过它来实现。
    在这里插入图片描述

    Code Snippets 常用语句

    一般会在脚本编写栏的右边都会有常用语句片段,点击以下就会出来代码,但是一开始不太了解的话点出来其实也看不懂。如下图:
    在这里插入图片描述官方文档解释的各种函数调用链接在这里:Postman Sandbox API

    以下是常用代码片段:

    // 获取response返回内容
    var res = responseBody; // 是字符串格式
    
    // 获取环境变量
    var v = pm.environment.get("variable_key");
    
    // 获取全局变量
    var gb = pm.globals.get("variable_key");
    
    // 获取普通变量
    var nm = pm.variables.get("variable_key");
    
    // 设置环境变量 
    // 只能存储字符串,如果是对象的话则无法在下次运行时获取到内容
    // 如需要存储JSON数据,可以用JSON.stringify(..)存储,再用JSON.parse(..)转化为对象使用
    pm.environment.set("variable_key", variable_value);
    
    // 设置全局变量
    pm.globals.set("variable_key", "variable_value");
    
    // 清除某个环境变量
    pm.environment.unset("variable_key");
    
    // 清除某个全局变量
    pm.globals.unset("variable_key");
    
    // 发送请求
    pm.sendRequest("https://postman-echo.com/get", function (err, response) {
        console.log(response.json());
    });
    
    // Javascript 获取变量类型
    console.log( typeof pm.enviroment );
    

    Pre-request Script 预处理脚本

    发送请求之前往往需要准备数据,比如设置header中参数或者计算签名。

    使用Pre-request Script可以编写一些准备数据。参考官方文档:Pre-request scripts

    常用的准备工作有:

    • 获取环境变量
    • 环境变量赋值
    • 发送一个请求
    • 拼接组合提交request请求所需要的参数,比如authentication code。

    常用的语句如下:

    // 获取环境变量
    var v = pm.environment.get("variable_key");
    
    // 获取全局变量
    var gb = pm.globals.get("variable_key");
    
    // 获取普通变量
    var nm = pm.variables.get("variable_key");
    
    // 设置环境变量 
    // 只能存储字符串,如果是对象的话则无法在下次运行时获取到内容
    // 如需要存储JSON数据,可以用JSON.stringify(..)存储,再用JSON.parse(..)转化为对象使用
    pm.environment.set("variable_key", variable_value);
    
    // 设置全局变量
    pm.globals.set("variable_key", "variable_value");
    
    // 清除某个环境变量
    pm.environment.unset("variable_key");
    
    // 清除某个全局变量
    pm.globals.unset("variable_key");
    
    // 发送请求
    pm.sendRequest("https://postman-echo.com/get", function (err, response) {
        console.log(response.json());
    });
    
    // 获取毫秒级时间戳
    var timestamp1 = Math.round(new Date().getTime());
    
    // 获取秒级时间戳
    var timestamp2 = Math.floor(new Date().getTime()/1000);
    
    // md5加密
    // 获取环境变量password
    var tmp = pm.environment.get("password");
    // 加密
    var m = CryptoJS.MD5(tmp).toString();
    // 加密后的值写入password
    pm.environment.set("password", m);
    
    // 设置一个1到4的随机整数,字段名是number,parselnt 是强制转换为整数
    pm.globals.set("number",parseInt(4*Math.random())+1);
    
    • 获取毫秒/秒级时间戳演示
      在这里插入图片描述
      在这里插入图片描述
    • md5加密演示:

    问题:一个登录接口,password需要md5加密后的值
    则:在Pre-request Script中拿到环境变量中password的值,进行md5加密,再将加密后的值保存进password变量。
    在这里插入图片描述
    pre脚本执行后,可看到运行后的环境变量password已经是加密后的值
    在这里插入图片描述
    也可在postman console(点击左上角View - Show Postman Console或使用快捷键Alt+Ctrl+C)中查看Request Body
    在这里插入图片描述
    小结:
    当postman的请求body或header中使用到了变量,有什么方法可以知道请求发送出去的实际值是什么?

    • 通过运行后的环境变量查看
    • 通过postman console查看
    • 通过fiddler等抓包查看

    Test Script 测试脚本

    测试脚本是在request之后,对Response的返回值进行下一步处理的脚本

    参加postman 官方:Test scripts
    参加postman 官方:Test examples

    常用的处理有:

    • 接口断言,保证用例可回归
    • 接口返回值数据的处理
    • 可以对环境变量赋值
    • 读取response回复的数据,存为环境变量

    常用的语句如下:

    // 获取response headers中某一个值
    ctype = postman.getResponseHeader("Content-Type");
    
    // 获取response body的全部内容
    text = pm.response.text();
    
    // 获取response返回的全部JSON
    json_data = pm.response.json();
    
    // 获取JSON中某一个值,比如name的值:
    var myName = json_data.name;
    
    // 检查一个JSON值
    var data = JSON.parse(responseBody); 
    tests["Your test name"] = data.value === 100;
    
    // XML转JSON
    var jsonObject = xml2Json(responseBody);
    

    常用断言方法如下,更多详见postman官方:Test scripts

    断言响应时间

    // 断言响应事件小于200ms
    pm.test("Response time is less than 200ms", function () {
        pm.expect(pm.response.responseTime).to.be.below(200);
    });
    

    断言状态码

    // 断言状态码200-202区间
    pm.test("Successful POST request", function () {
        pm.expect(pm.response.code).to.be.oneOf([200,202]);
    });
    
    // 断言状态码等于200
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    

    断言response的body中是否包含字符串

    // 断言响应body中包含字符串:string_you_want_to_search 可替换为需要检验的内容
    pm.test("Body matches string", function () {
        pm.expect(pm.response.text()).to.include("string_you_want_to_search");
    });
    
    // 例:需要校验body是否包含"OK"
    pm.test("Body matches string", function () {
        pm.expect(pm.response.text()).to.include("OK");
    });
    

    断言response的header中是否包含Content-Type

    pm.test("Content-Type is present", function () {
        pm.response.to.have.header("Content-Type");
    });
    

    断言响应中的字段等于某个值

    // 断言响应中"message" = ok"
    pm.test("message test", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData["message"]).to.eql("ok");
    });
    

    断言响应中的字段不等于某个值

    // 断言响应中"message" != bad"
    var jsonData = JSON.parse(responseBody);
    tests["message不为bad"] = jsonData["message"] != "bad";
    

    断言响应中的列表长度

    // 断言响应中"list"的字段长度
    pm.test("data list test", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData["data"].length).to.eql(41);
    });
    

    断言响应中的列表中第几个元素的字段值

    // 断言响应中"list 0的"的time字段的值
    pm.test("data list 0 test", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData["data"][0]["time"]).to.eql("2018-11-28 17:27:41");
    });
    

    Test Result 测试结果

    除了上面的具体功能代码外,经常还需要返回一个结果,告诉Postman这个测试结果是Pass还是Fail,默认是pass。

    这里返回值就不是简单的return语句可以,必须要通过Postman自带的对象或方法才可以,一般是通过pm.expect()或tests[]这两个地方返回测试结果。

    完整的测试示范:

    // 测试接口返回状态码是200:
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    

    在这里插入图片描述
    这些方法名看起来都很容易理解,一般都会叫pm.expect()或.to.be()或.to.have()这样的,字面意思就是期待什么或要求它必须是什么或必须有什么,才能通过测试。
    另外,同样的测试结果,实际上还有更简单的写法,即不通过pm对象,而是内置tests对象。

    常用操作如下:

    // 反应时间必须少于200毫秒
    tests["Response time is less than 200ms"] = responseTime < 200;
    
    // 判断反应代号是否等于某一个指定的代号
    tests["Status code name has string"] = responseCode.name.has("Created");
    

    看这个用法,猜测tests是一个JSON格式的对象,tests[…]括号内的字符串是测试的描述, =后面是判断语句,然后将True或False赋予为tests[…]的值,然后postman轮训所有tests对象里的参数,并返回pass与否的结果。

    这里是官方总结的常用测试脚本方法:Test examples

    以下是常用的返回测试结果的内置函数:

    # “期待”返回结果必须包含某一段内容
    pm.expect(从response里获取的字符串).to.include("必须包含的内容");
    
    # 返回body值必须完全等于某一段内容
    pm.response.to.have.body("必须等于的内容");
    
    # 反应时间必须少于200毫秒
    pm.expect(pm.response.responseTime).to.be.below(200);
    
    # 必须返回某一个状态 如"Created"
    pm.response.to.have.status("状态名");
    

    Debugging 脚本调试

    如果要看已经设置的Enviroment变量的话,可以点开右上方小眼睛看到,如下图,我设置了2个环境变量:
    在这里插入图片描述
    调试时要打印的话,一般都是用console.log(…),这样就能在console中看到:

    • 如果你的Postman是Chrome app的话,直接在chrome浏览器的开发者工具里调试就行。
    • 如果是Mac等桌面软件,则需要打开内置的console才能看到调试信息。
      位置在左下角,如下图:
      在这里插入图片描述
      postman console 页面如下图:
      在这里插入图片描述

    Postman Sandbox

    Postman的Sandbox是Postman内部默认引入的第三方JS库。

    参考:Postman Sandbox API reference 官方引用的脚本库详解

    1.常用的库和工具

    • jQuery (Deprecated)
      Cross-platform JavaScript library. This will be removed in future versions of the sandbox.

    • Lodash
      JS utility library

    • BackboneJS (Deprecated)
      Provides simple models, views, and collections. This will be removed in future versions of the sandbox.

    • SugarJS
      Extends native JS objects with useful methods

    • tv4 JSON schema validator
      Validates JSON objects against v4 of the json-schema draft

    • CryptoJS
      standard and secure cryptographic algorithms. Supported algorithms: AES, DES, EvpKDF, HMAC-MD5, HMAC-SHA1/3/256/512, MD5, PBKDF2, Rabbit, SHA1/3/224/256/512, TripleDES

    • xml2Json(xmlString)
      This function behaves the same in Newman and Postman

    • xmlToJson(xmlString)(Deprecated)
      This function does NOT behave the same in Newman and Postman

    • postman.getResponseHeader(headerName) (Test-only)
      returns the response header with name “headerName”, if it exists. Returns null if no such header exists. Note: According to W3C specifications, header names are case-insensitive. This method takes care of this.
      postman.getResponseHeader(“Content-type”) and postman.getResponseHeader(“content-Type”) will return the same value.

    生成MD5字符串:

    var hashed  = CryptoJS.MD5("待加密的字符串").toString();
    

    文件转base64字符串:

    s = 'Hello';
    // 先转化成UTF-8编码的字符串
    utf8 = CryptoJS.enc.Utf8.parse( s );
    // 用CryptoJS第三方库(Postman已经内置了)进行编码
    b64 = CryptoJS.enc.Base64.stringify(utf8)
    
    console.log(b64);
    // aGVsbG8=
    

    Postman SDK

    不同于Sandbox,这是Postman内部较高级的SDK,可以引用一些方便的方法。
    参考官网:Tutorial: Postman SDK Concepts

    URL转换成JSON格式,并获取指定的参数值:

    var sdk = require('postman-collection');
    query = ( new sdk.Url(callback) ).toJSON().query;
    
    for (var i in query) {
        console.log(query[i].key +": "+ query[i].value);
    }
    
    展开全文
  • Bro脚本语法4-声明和语句(Declarations and Statements)@(教程)[Bro]Declarations Name Description module 改变当前模块 export 从当前模块导出定义 global 声明一个全局变量 const 声明一个全局常量 ...
  • shell脚本语法基础汇总

    万次阅读 2012-12-06 00:56:49
    sh -n sh16.sh 不执行script,仅查询语法 sh -x sh16.sh 将script执行过程全部列出来 需要给变量赋值时,可以这么写:  变量名=值  要取用一个变量的值,只需在变量名前面加一个$ a="hello world...
  • 前面一篇文章Android 进阶——Android Studio 项目结构详细述及Gradle脚本语法android节点配置完全解析(二)总结了下Android Studio中Gradle 脚本中最终哟啊的的形式,详细介绍了Project下几乎所有重要文件及目录的...
  • 一、update-script脚本源码 assert(!less_than_int(1377158385, getprop("ro.build.date.utc"))); assert(getprop("ro.product.device") == "g18ref" ||  getprop("ro.build.product") == "g18ref"); show_pro
  • Shell脚本语法-- if/then/elif/else/fi

    万次阅读 2014-01-14 14:58:31
    此外,Shell还提供了&&和||语法,和C语言类似,具有Short-circuit特性,很多Shell脚本喜欢写成这样: test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1) &&相当于“ if...
  • sh脚本base64加密

    千次阅读 2019-06-04 09:02:31
    test=$(printf "%s""root" | base64) #base64加密 tt=$(printf "%s" $test| base64 -d) #base64解密 echo $test $tt
  • OllyScript脚本语言是一个种类汇编的语言。你使用它来控制ODbgScript和脚本运行. 在后面的文档中, “源操作数” 和 “目的操作数”表示以下含义: - 十六进制常数,既没有前缀也没有后缀。 (例如:是00FF, 而...
  • 下面来详细地分析语法分析相关的类,以便了解整个语法分析的过程和细节,这样也方便地复用第二人生里的脚本编译器,达到源码复用的目标。先来分析类LLScriptFilePosition,它的声明代码如下:#001 class ...
  • 脚本里有很多语句组成的,那么对于语句又是怎么进行语法分析的呢?下面就来分析for语句的分析过程,它的声明代码如下:#001 class LLScriptFor : public LLScriptStatement#002 {#003 public: 构造函数,输入...
  • .bat脚本基本命令语法

    千次阅读 2018-03-17 14:39:15
    目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息)  1、REM 和 ::  2、ECHO 和 @  3、PAUSE  4、ERRORLEVEL  5、TITLE  6、COLOR  7、mode 配置系统设备  8、GOTO 和 : ... 1
  • Lua基本语法/Redis使用Lua脚本

    千次阅读 2018-03-21 00:23:17
    Lua 学习目标是 能写一些 Lua脚本。 Redis 使用Lua 5.1 版本。 Lua是动态类型语言。 1.数据类型 空 nil 没有赋值的变量或表的字段 都是nil 布尔 boolean 包含 true 和 false 字符串 string 如 'a' 或 "a" 表 ...
  • base64加密PHP脚本的解码方法

    千次阅读 2015-02-03 00:20:56
    PHP运行环境本身是开源的,服务器不加载插件时PHP脚本也无法加密。... 然而,PHP运行环境的本质决定了,被混淆、编码的PHP脚本总是有...本文介绍了一种对含有eval和base64_decode的、被加密的PHP的解码方法。 在使用
  • Android脚本打包之ant语法

    千次阅读 2013-03-21 21:44:45
    以下内容整理自网上相关文章,详情见最后链接: ...1.ant的编译文件默认为build.xml ...packageset一定要设定,否则找不到源码,格式可以是**....博客园的一篇介绍ant语法的文章,比较详细,格式清晰
  • v 脚本元素共有3类脚本元素i) 用于要被执行的代码块的小脚本(scriptlet)ii) 用于要被执行的单个语句的表达式(expression)iii) 用于声明变量和方法的声明(declaration)Ø 使用page指令的脚本属性 
  • ##Description 使用 React.js 和 ES6 语法的基础项目。 用于使用 liveReload 和 CSS 注入启动服务器的 Gulp 脚本。 ###文件观察者 转译和 linting JSX 和 ES6 编译 SCSS --> CSS 安装 您需要全局安装 Gulp: $...
  • 深入浅出Python——Python基础语法全解

    万次阅读 多人点赞 2020-07-24 20:31:37
    前言:Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 文章目录一、Python简介1. 了解Python2. Python介绍3. Python特点4. Python发展历史5. Python版本二、Python解释器1. 解释器的作用...
  • 文章目录 1.bc 2.bc 还可以进行二进制的转换 3.截取指定的小数点 4.bc 对平方根进行计算 5.bc 计算中怎么保留后几位数 1.bc ...最简单的 加 减 乘 除 求余 小数点...脚本解释 scale=2 是脚本中保留2位小数的意思
  • 在自己写脚本之前,用了两三套自动部署工具,都是组里面别的同学写的,写得非常棒,但使用过程中总是遇到这样那样的问题,而且自己无法解决,必须要作者协助。干脆自己写一个,慢一点,自动化程度低一点,但是控制力...
  • Angular4 - 模板语法

    千次阅读 2018-03-03 12:56:35
    但值得注意的例外是元素,它被禁用了,以阻止脚本注入攻击的风险。(实际上,只是被忽略了。) 有些合法的 HTML 被用在模板中是没有意义的。、和元素这个舞台上中并没有扮演有用的角色。剩下的所有元素基本上就都...
  • Redis脚本

    万次阅读 2014-12-23 09:31:06
    Redis脚本 使用脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。...调用Lua脚本语法
  • Lua教程: C++嵌入Lua脚本

    万次阅读 2018-06-12 15:26:33
    如果想学习语法,可以看《lua程序设计》,虽然讲的是lua5.1,但是很多语法还是可以学的。当你学会了最基本的c++与lua调用之后,就可以马上学一些交互代码了,而不是只是看书,那么看了之后,你会很容易忘记的,之前我...
  • GitLab CI脚本编写

    千次阅读 2020-03-15 09:24:26
    1、GitLab CI脚本基本语法 GitLab CI Runner常用的有两种,一种是Shell的,另一种是Docker的,采用Docker Runner的话需要指定具体镜像,脚本中可以通过tags指定执行该作业的Runner 基本语法案例: image: xxx # 基础...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,113
精华内容 20,045
关键字:

base脚本语法