SecureCrt脚本(三)二级对象之Screen详解
Crt自动化 测试 SecureCrt脚本 JS脚本

- 1、引言
- 2、Screen属性和方法
- 2.1、属性
- 2.1.1、CurrentColumn
- 2.1.2、CurrentRow
- 2.1.3、Columns
- 2.1.4、Rows
- 2.1.5、IgnoreEscape
- 2.1.6、MatchIndex
- 2.1.7、Synchronous
- 2.2、方法
- 2.2.1、Clear()
- 2.2.2、get()
- 2.2.3、get2()
- 2.2.4、IgnoreCase()
- 2.2.5、Send()
- 2.2.6、SendKeys()
- 2.2.7、SendSpecial()
- 2.2.8、WaitForCursor()
- 2.2.9、WaitForKey()
- 2.2.10、WaitForString()
- 2.2.11、WaitForStrings()
- 2.2.12、ReadString()
- 3、总结
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详解的更多相关文章
- window对象的screen详解
screen.availHeight 返回屏幕的高度(不包括Windows任务栏)screen.availWidth 返回屏幕的宽度(不包括Windows任务栏)screen.colo ...
- Java进阶(三十二) HttpClient使用详解
Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...
- Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解
Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...
- SaltStack 入门到精通第三篇:Salt-Minion配置文件详解
SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ 发布日期:2014-06-09 17:52:16 ##### 主要配置设置 ##### 配置 默认值 ...
- 【转载】图说C++对象模型:对象内存布局详解
原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...
- 用Newtonsoft将json串转为对象的方法(详解)
首先,将json串转为一个JObject对象: JObject jo = (JObject)JsonConvert.DeserializeObject(CurrentSelectedItemReq) ...
- CEPH-4:ceph RadowGW对象存储功能详解
ceph RadosGW对象存储使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍对象存储RadosGw功能如何灵活的使用,集群背景: $ ceph -s clust ...
- Scala 深入浅出实战经典 第64讲:Scala中隐式对象代码实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- java使用POI操作XWPFDocument中的XWPFRun(文本)对象的属性详解
java使用POI操作XWPFDocument中的XWPFRun(文本)对象的属性详解 我用的是office word 2016版 XWPFRun是XWPFDocument中的一段文本对象(就是一段文 ...
随机推荐
- rocksdb 编译安装 日志
Compilation RocksDB's library should be able to compile without any dependency installed, although w ...
- hdparm测试硬盘性能
<1>Centos安装hdparm测试硬盘性能 一.安装hdparm yum install hdparm -y Linux学习,http:// linux.it.net.cn 二.评估读 ...
- 获取网页文档的URL和连接来源
<script type="text/javascript">document.write("链接来源:"+document.referrer+&q ...
- dom 中事件
阻止表单提交: function aa(){ return false; } function bb(event){ event.preventDefault(); } 事件不再派发: <!DO ...
- SQL— CONCAT(字符串连接函数)
有的时候,我们有需要将由不同栏位获得的资料串连在一起.每一种资料库都有提供方法来达到这个目的: MySQL: CONCAT() Oracle: CONCAT(), || SQL Server: + C ...
- myeclipse高版本对应tomcat低版本解决办法
今天在帮同事调试程序的时候,冒出来一个异常,网上搜搜,结果如下: 将项目部署好后,启动tomcat后报错,java.lang.NoClassDefFoundError: org/apache/juli ...
- python为什么有私有方法和变量
1. 访问安全,其实也没有决定的安全 >>> class humer(object): ... def __init__(self, name): ... self.name = n ...
- opencv学习笔记(四)投影
opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...
- Android UI组件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- redis 认证密码
[root@cache01 ~]# grep "requirepass" /app/server/redis/conf/6379.conf # If the master is p ...