Crt自动化 测试 SecureCrt脚本 JS脚本

 各位看官们喜欢的话,识别二维码,给个打赏哟,大家的激励也是我的动力~
 
 

1、引言

本节开始讲解Crt脚本中最常用,也是功能最强大的二级对象Screen的属性和方法,凡是需要和远程设备进行交互的部分都是需要使用Screen对象的属性或方法的,因此本节将是重点。

2、Screen属性和方法

属性 方法
CurrentColumn Clear
CurrentRow Get
Columns Get2
Rows IgnoreCase
IgnoreEscape Send
MatchIndex SendKeys
Synchronous SendSpecial
  WaitForCursor
  WaitForKey
  WaitForString
  WaitForStrings
  ReadString

2.1、属性

2.1.1、CurrentColumn

解释

返回当前光标处的列坐标,如下图所示的下面显示的数字"9"就是当前光标位于第9列。

语法

crt.Screen.CurrentColumn

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" var curCol = crt.Screen.CurrentColumn;
    crt.Dialog.MessageBox(curCol);

2.1.2、CurrentRow

解释

返回当前光标处的行坐标,如下图所示的下面显示的数字"35"就是当前光标位于第35行。但这个功能有个问题就是当满屏输出后这个值一直表示最大值,等同于底下要讲的子属性四:Rows的值。

语法

crt.Screen.CurrentRow

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" var curRow = crt.Screen.CurrentRow;
    crt.Dialog.MessageBox(curRow);

2.1.3、Columns

解释

返回当前屏幕的最大列宽。

语法

crt.Screen.Columns

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" var cols = crt.Screen.Columns;
    crt.Dialog.MessageBox(cols);

2.1.4、Rows

解释

返回当前屏幕的最大行宽,这个行宽指的是可见区的,并不是指缓冲区的行宽

语法

crt.Screen.Rows

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" var rows = crt.Screen.Rows;
    crt.Dialog.MessageBox(rows);

2.1.5、IgnoreEscape

解释

定义当使用WaitForString、WaitForStrings 和 ReadString这三个方法时是否获取Escape字符(也就是特殊控制字符,如"\n"),默认是会获取的。

语法

crt.Screen.IgnoreEscape [ = True | False ]

参数:

true|false:当设置为true时不会获取特殊字符,为false时会获取,默认为false。

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" // 设置false,获取ctrl+c
    crt.Screen.IgnoreEscape = false;
    crt.Dialog.MessageBox(crt.Screen.ReadString("\03")); // 设置true,不获取ctrl+c
    crt.Screen.IgnoreEscape = true;
    crt.Dialog.MessageBox(crt.Screen.ReadString("\03"));

2.1.6、MatchIndex

解释

当使用WaitForStrings 和 ReadString这两个方法获取字符串时,会根据参数的位置获取返回值,而MatchIndex就是这个位置,从1开始计算,如果没有一个匹配到则返回0,可以根据下面的例子来看。

语法

crt.Screen.MatchIndex

代码

  • JS
  •  # $language = "JScript"
    # $interface = "1.0" var outPut = crt.Screen.ReadString("error", "warning", "#", 10);
    switch (crt.Screen.MatchIndex) {
    case 0:
    crt.Dialog.MessageBox("Timed out!")
    break;
    case 1:
    crt.Dialog.MessageBox("Found 'error'")
    break;
    case 2:
    crt.Dialog.MessageBox("Found 'warning'")
    break;
    case 3:
    crt.Dialog.MessageBox("Found '#'")
    break;
    }

2.1.7、Synchronous

解释

设置屏幕的同步属性,关于该属性需要谨慎对待,若设置为false,则在脚本中使用WaitForString、WaitForStrings或ReadString函数时可能存在丢失一部分数据的现象,而设置为true时不会,但是设置为true后可能会存在屏幕卡顿的情况,出现这两种现象的原因应该是和这几个函数以及打印字符到Screen的机制有关系,具体内部原因不明,就具体使用而言,如果是跑脚本的话最好还是不要设置为true,大量的卡顿看着就会蛋疼了,还可能会造成CRT卡死。

语法

crt.Screen.Synchronous [ = True | False ]

参数:

true|false :默认为false

代码

  • JS
  •  # $language = "JScript"
    # $interface = "1.0" crt.screen.Synchronous = true;
    crt.screen.Send("\r\n");
    crt.screen.ReadString("#");
    crt.screen.Send("\r\n");
    crt.screen.WaitForString("#");
    crt.screen.Send("\r\n");
    crt.screen.WaitForStrings("#",">");

2.2、方法

2.2.1、Clear()

解释

清屏功能

效果类似下面这个屏幕:

语法

crt.Screen.Clear()

代码

  • JS
  •  # $language = "JScript"
    # $interface = "1.0" crt.Screen.Send("\r\n");
    crt.Screen.Send("\r\n");
    crt.Screen.Send("\r\n");
    crt.Screen.Send("\r\n");
    crt.Screen.Clear();

2.2.2、get()

解释

按照坐标取出一个矩形框内的屏幕上的字符(即从某行某列开始到其它行其它列),不包含字符串中的回车换行符,所以这个多用于获取无格式的光标处字符串或某小段特定区域字符串。

语法

crt.Screen.Get(row1, col1, row2, col2)

代码

  • JS
  •  # $language = "JScript"
    # $interface = "1.0" var getScr = crt.Screen.Get(31,50,31,56);
    crt.Dialog.MessageBox(getScr);

    这段代码获取的是(31,50,31,56)这个矩阵内的字符串,即下图中红色框中所示的7483052。

2.2.3、get2()

解释

按照坐标取出一个矩形框内的屏幕上的字符(即从某行某列开始到其它行其它列),包含字符串中的回车换行符,所以这个多用于获取大段带格式的字符串。

语法

crt.Screen.Get2(row1, col1, row2, col2)

代码

  • JS
  •  # $language = "JScript"
    # $interface = "1.0" var getScr = crt.Screen.Get2(29,1,35,20);
    crt.Dialog.MessageBox(getScr);

    这段代码获取的是(29,1,35,20)这个矩阵内的所有带回车换行的字符串,即下图中红色框中文字。

2.2.4、IgnoreCase()

解释

使用全局参数设置控制在使用WaitForString、WaitForStrings和ReadString这三个函数时是否对大小写敏感,默认为false指大小写敏感即大小写字符串都会检查,设置为true时则不会检测大小写。

语法

crt.Screen.IgnoreCase

请注意,语法中并没有带(),根据语法来看,这个不像是方法,但是在CRT的使用说明中标注为了方法而不是属性,且在python的脚本中是当做方法使用的,因此这里先归类为方法,但是在JS脚本中是不带()使用的。

代码

  • JS
  •  # $language = "JScript"
    # $interface = "1.0" crt.Screen.IgnoreCase = true;
    crt.Screen.Send("show memory\r\n");
    crt.Screen.WaitForString("more");
    crt.Screen.Send("\r\n");
    crt.Screen.WaitForStrings("more","#");
    crt.Screen.Send("\r\n");
    crt.Screen.ReadString("more","#");

2.2.5、Send()

解释

向远端设备或者向屏幕(向屏幕发送的功能是CRT7.2以后版本才提供的)发送字符串。如语法中所表示的,string是待发送的字符串,这个字符串可以包含转码字符比如"\r","\n","\03"(ctrl+c),当向屏幕上发送字符串时需要指定第二个参数为true。有了向屏幕发送字符串的功能,我们就可以很方便的和用户进行交互了。可以打印出一些我们需要的报错信息之类的。

语法

crt.Screen.Send(string, [, bSendToScreenOnly])

代码

  • JS
  •  # $language = "JScript"
    # $interface = "1.0" // 向远程设备发送英文命令"show memory"
    crt.Screen.Send("show memory\r\n"); // 向屏幕上发送字符串
    crt.Screen.Send("hello,world!\r\n",true);

    可是运行了这段代码后很可能会发现,底下的向屏幕发送的字符串先打印到屏幕上了,效果如下,原因是Crt发送到屏幕的字符串可能先于远程设备返回的字符串,因此会先打印下面的。解决办法就是可以在发送屏幕的这一段前面加一个延时,这样就不会先打印下面的了。

2.2.6、SendKeys()

解释

向当前窗口发送按键,包含组合按键,比如可以发送类似"CTRL+ALT+C"等这样的组合键,这样写即可:

crt.screen.sendkeys("^%c");

这个功能需要语言本身支持,目前只有VBS和JS脚本可以使用,Python和Perl都不可以。

语法

crt.Screen.SendKeys(string)

代码

  • JS
  •  # $language = "JScript"
    # $interface = "1.0" crt.Screen.Clear();
    crt.screen.sendkeys("mc~");
    crt.Sleep(2000);
    crt.screen.sendkeys("{f1}");
    crt.Sleep(2000);
    crt.screen.sendkeys("{esc}0");
    crt.Sleep(2000);
    crt.screen.sendkeys("{esc}0");
    crt.Sleep(2000);
    crt.screen.sendkeys("y");

具体可以有哪些按键,参照下表,修改对应参数即可,可以根据需要自由组合:

  • Key(按键)

    Argument(参数)

    SHIFT

    +

    CTRL

    ^

    ALT

    %

    BACKSPACE

    {BACKSPACE}, {BS}, or {BKSP}

    BREAK

    {BREAK}

    CAPS LOCK

    {CAPSLOCK}

    DEL or DELETE

    {DELETE} or {DEL}

    DOWN ARROW

    {DOWN}

    END

    {END}

    ENTER

    {ENTER} or ~

    ESC

    {ESC}

    HELP

    {HELP}

    HOME

    {HOME}

    INS or INSERT

    {INSERT} or {INS}

    LEFT ARROW

    {LEFT}

    NUM LOCK

    {NUMLOCK}

    PAGE DOWN

    {PGDN}

    PAGE UP

    {PGUP}

    PRINT SCREEN

    {PRTSC}

    RIGHT ARROW

    {RIGHT}

    SCROLL LOCK

    {SCROLLLOCK}

    TAB

    {TAB}

    UP ARROW

    {UP}

    F1, F2, ... F16

    {F1}, {F2}, ... {F16}

    0, 1, ... 9 on number pad

    {NUM_0}, {NUM_1}, ... {NUM_9}

    . on number pad

    {NUM_.}

    / on number pad

    {NUM_/}

    * on number pad

    {NUM_*}

    - on number pad

    {NUM_-}

    + on number pad

    {NUM_+}

    ENTER on number pad

    {NUM_ENTER}

    HOME on number pad

    {NUM_HOME}

    PAGE UP on number pad

    {NUM_PGUP}

    END on number pad

    {NUM_END}

    PAGE DOWN on number pad

    {NUM_PGDN}

    UP ARROW on number pad

    {NUM_UP}

    DOWN ARROW on number pad

    {NUM_DOWN}

    LEFT ARROW on number pad

    {NUM_LEFT}

    RIGHT ARROW on number pad

    {NUM_RIGHT}

2.2.7、SendSpecial()

解释

可以发送特殊控制码,这个控制码是Crt内置的功能,具体可以包含的有Menu、Telnet、VT functions功能列表中提供的所有功能,即下图中的这些,有兴趣可以调出new button后看到这些:

Menu Function:

Telnet:

VT functions:

语法

crt.Screen.SendSpecial(string)

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0"
    // 以下是Crt文档中举的例子,具体还有什么我也没有试过,各位可以自己试试
    crt.screen.SendSpecial("MENU_PASTE");
    crt.screen.SendSpecial("TN_BREAK");
    crt.screen.SendSpecial("VT_PF1");

2.2.8、WaitForCursor()

解释

等待光标移动,当移动时返回值为true,当有超时时间参数且超时时返回false,否则会一直等待光标移动。利用这个功能可以用来判断一个命令的输出是否结束,只不过超时时间是以秒为单位的,对于脚本当中,这个时间还是略显久了。

语法

crt.Screen.WaitForCursor([timeout])

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" // 每5秒内光标有移动时即发送一个命令
    while (1) {
    if ( crt.Screen.WaitForCursor(5) ) {
    crt.Screen.Send("show version\r\n");
    }
    }

2.2.9、WaitForKey()

解释

检测有键盘按键时返回true,当有超时时间参数且超时时返回false,否则会一直等待按键。只可惜这个函数不知道输入的键是什么,否则就可以针对性的判断了,它只能检测到有输入而已。

语法

crt.Screen.WaitForKey([timeout])

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" // 每5秒内有输入时发送一个命令
    while (1) {
    if ( crt.Screen.WaitForKey(5) ) {
    crt.Screen.Send("show version\r\n");
    }
    }

2.2.10、WaitForString()

解释

一般用于发送命令后等待某字符串,这个字符串只要是屏幕上出现的即可,哪怕是粘贴上去的命令也会同样被检测到,也可以用于等待屏幕的输出打印,不需要先发送命令。不过一般我们使用它来检测的都是发送命令后出现的标识符。

语法

crt.Screen.WaitForString(string,[timeout],[bCaseInsensitive])

参数:

1、string,必选参数,等待的字符串,可以是特殊字符比如:\r\n;

2、timeout,可选参数,超时时间,当检测不到对应字符串时会返回false,没有此参数时会一直等待;

3、bCaseInsensitive,可选参数,大小写不敏感,默认值是false,表示将检测字符串的大小写,当为true时不检测大小写。

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" // 发送命令,并在5秒内获取到对应的字符串后发送一条命令
    crt.Screen.Send("\r\n");
    if ( crt.Screen.WaitForString("#",5) ) {
    crt.Screen.Send("show version\r\n");
    }
    crt.Screen.Send("\r\n");
    if ( crt.Screen.WaitForString(">",5) ) {
    crt.Screen.Send("who\r\n");
    }
    crt.Screen.Send("\r\n");
    if ( crt.Screen.WaitForString("$",5) ) {
    crt.Screen.Send("ls -l\r\n");
    }

2.2.11、WaitForStrings()

解释

和WaitForString是同样的功能,只不过可以等待多个字符串,如果有匹配到某个字符串,则返回值该字符串在这些字符串中的位置,位置值从1开始。若在超时时间内没有匹配到则返回false,没有超时时间时会一直等待。

语法

crt.Screen.WaitForStrings([string1,string2..],[timeout],[bCaseInsensitive])

参数:

1、string,必选参数,等待的字符串,最少有一个,可以是特殊字符比如:\r\n;

2、timeout,可选参数,超时时间,当检测不到对应字符串时会返回false,没有此参数时会一直等待;

3、bCaseInsensitive,可选参数,大小写不敏感,默认值是false,表示将检测字符串的大小写,当为true时不检测大小写。

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" var outPut = crt.Screen.WaitForStrings("error", "warning", "#", 10);
    var waitIndex = crt.Screen.MatchIndex
    switch (waitIndex) {
    case 0:
    crt.Dialog.MessageBox("Timed out!")
    break;
    case 1:
    crt.Dialog.MessageBox("Found 'error'")
    break;
    case 2:
    crt.Dialog.MessageBox("Found 'warning'")
    break;
    case 3:
    crt.Dialog.MessageBox("Found '#'")
    break;
    }

    上面也用到了crt.Screen.MatchIndex功能,具体可以见上面的2.1.6节。

2.2.12、ReadString()

解释

这个功能和上面的WaitForStrings函数有些类似,都是等待某几个字符串出现,不过不同的是,ReadString函数还会读取字符串之前的所有出现的字符,这个功能可以很方便的用于发送一个命令后获取这个命令的输出结果,不过这个函数也不是特别稳定,因为很可能存在命令的输出结果很快,而屏幕又没有捕捉到时,要么会由于超时而返回false,要么会一直等待,最终返回的都是空值,因此完全依靠该函数获取命令的输出的话并不是很把稳(如果程序对于稳定性要求很高的话,那么最好还是不要依赖这个函数。)

语法

crt.Screen.ReadString([string1,string2..],[timeout],[bCaseInsensitive])

参数:

1、string,必选参数,等待的字符串,最少有一个,可以是特殊字符比如:\r\n;

2、timeout,可选参数,超时时间,当检测不到对应字符串时会返回false,没有此参数时会一直等待;

3、bCaseInsensitive,可选参数,大小写不敏感,默认值是false,表示将检测字符串的大小写,当为true时不检测大小写。

代码

  • JS

     # $language = "JScript"
    # $interface = "1.0" // 发送命令并根据提示符获取命令的输出。
    crt.Screen.Send("show version\r\n");
    crt.Screen.WaitForString("show version",2);
    var outPut = crt.Screen.ReadString("error", "warning", "#", 10);
    var waitIndex = crt.Screen.MatchIndex
    switch (waitIndex) {
    case 0:
    crt.Dialog.MessageBox("Timed out!")
    break;
    case 1:
    crt.Dialog.MessageBox("Found 'error'")
    break;
    case 2:
    crt.Dialog.MessageBox("Found 'warning'")
    break;
    case 3:
    crt.Dialog.MessageBox("命令的输出时:"+outPut);
    break;
    }

    在这个举例中的第6行可以看到还使用了WaitForString,为什么要使用这个,有两个方面原因,一是确定命令已经被发送到了远端设备,二是确保命令的输出结果中没有改命令,而仅仅是该命令的输出结果。

3、总结

以上就是Screen这个二级属性的所有子属性和子方法了,这里面的功能都是CRT系列中最最重要的功能,也是最常用的功能,大家可以平时在写脚本时多琢磨这些函数的用法和奇妙之处。

SecureCrt脚本(三)二级对象之Screen详解的更多相关文章

  1. window对象的screen详解

    screen.availHeight     返回屏幕的高度(不包括Windows任务栏)screen.availWidth     返回屏幕的宽度(不包括Windows任务栏)screen.colo ...

  2. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  3. Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解

    Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...

  4. SaltStack 入门到精通第三篇:Salt-Minion配置文件详解

    SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ  发布日期:2014-06-09 17:52:16   ##### 主要配置设置 ##### 配置 默认值 ...

  5. 【转载】图说C++对象模型:对象内存布局详解

    原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...

  6. 用Newtonsoft将json串转为对象的方法(详解)

    首先,将json串转为一个JObject对象: JObject jo = (JObject)JsonConvert.DeserializeObject(CurrentSelectedItemReq) ...

  7. CEPH-4:ceph RadowGW对象存储功能详解

    ceph RadosGW对象存储使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍对象存储RadosGw功能如何灵活的使用,集群背景: $ ceph -s clust ...

  8. Scala 深入浅出实战经典 第64讲:Scala中隐式对象代码实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  9. java使用POI操作XWPFDocument中的XWPFRun(文本)对象的属性详解

    java使用POI操作XWPFDocument中的XWPFRun(文本)对象的属性详解 我用的是office word 2016版 XWPFRun是XWPFDocument中的一段文本对象(就是一段文 ...

随机推荐

  1. 经典的SQL面试题

    SQL中 inner join. left join .right join. outer join之间的区别 A表(a1,b1,c1) B表(a2,b2) a1 b1 c1 a2 b2 01 数学 ...

  2. 《ASP.NET MVC4 WEB编程》学习笔记------Model模型绑定

    本文转载自haiziguo Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对 ...

  3. Python学习之字典详解

    在元组和列表中,都是通过编号进行元素的访问,但有的时候我们按名字进行数据甚至数据结构的访问,在c++中有map的概念,也就是映射,在python中也提供了内置的映射类型--字典.映射其实就是一组key ...

  4. 分页管理的JSTL实现

    userMgr.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...

  5. javascript十六进制数字和ASCII字符之间转换

    var hex="0x29";//十六进制 var charValue = String.fromCharCode(hex);//生成Unicode字符 var charCode ...

  6. protostuff简单应用

    protobuf是谷歌推出的与语言无关.平台无关的通信协议,一个对象经过protobuf序列化后将变成二进制格式的数据,所以他可读性差,但换来的是占用空间小,速度快.居网友测试,它的序列化效率是xml ...

  7. C++C++中构造函数与析构函数的调用顺序

    http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...

  8. Android之记住密码与自动登陆实现

    本文主要讲述了利用sharedpreference实现记住密码与自动登陆功能 根据checkbox的状态存储用户名与密码 将结果保存在自定义的application中,成为全局变量 布局文件 < ...

  9. 关于Qt的事件循环以及QEventLoop的简单使用

    1.一般我们的事件循环都是由exec()来开启的,例如下面的例子: 1 QCoreApplicaton::exec() 2 QApplication::exec() 3 QDialog::exec() ...

  10. 【现代程序设计】homework-10

    作业地址:http://www.cnblogs.com/xinz/p/3441537.html 进行中...