官方手册:https://ttssh2.osdn.jp/manual/4/en/macro/index.html
Tera term的脚本和log均不支持中文,书写时尽量使用英文,否则会出现乱码。
首先举个例子,编写一个循环开机测试:
场景描述:
- 上电开机 - 等待出现某行字符 - 激活控制台 - 在控制台中输入reboot - 重启 - 重复100次 ……
样例代码:
; powercycle.ttl
for i 1 100
wait "rock-3a login:"
pause 5
sendln "username"
sendln "password"
sendln "sudo reboot"
sendln "password"
next
修饰一下样例代码,将日志打印到d盘powercycle.log,打印时间戳和次数记录:
; powercycle_logged.ttl
changedir "d:"
logopen "powercycle.log" 0 0 1 1
for i 1 100
wait "rock-3a login:"
sprintf "%s %d %s" #13"*** This is " count " time(s) for powercycle ***"#13
logwrite inputstr
pause 5 /* Wait for other init process after cli available */
sendln "username"
sendln "password"
sendln "sudo reboot"
sendln "password"
next
wait "rock-3a login:"
logclose
一点点语法
如何表示常量
- $[十六进制]:例如$3a,代表十进制的58
- ttl语法不支持浮点数
- ttl语法不区分单引号和双引号,但是必须成对使用。连续多个字符串自动拼接。
- #[ASCII编号]:例如#65,代表字符“A”。也可以用来发送不可见的控制符,例如#13代表换行符。
如何表示变量
- 变量或标号名必须字母或下划线开头,不区分大小写,最长32字节
- 有一些预留关键字不能作为变量名,见官方手册。
- teraterm有一些系统变量,例如timeout用于存放超时条件,result用于存放执行结果等,类似于CPU内部的部分寄存器,在判断结束后根据寄存器的值了解判断结果。
标号
- 标号可以和return成对使用,达到函数调用的效果。
- call [标号]用于跳转到标号的位置执行。
常见运算符
- 基本和C语言一样
- “=”和“==”都可以用于等于判断
- and or xor not是位运算符,不是逻辑运算符
循环和条件
由于没有缩进和大括号控制语句块,循环和条件都有特定的结束语句。
if <cond1> then
......
elseif <cond2> then
......
endif
for i <start> <end>
......
next
while <cond>
......
endwhile
此外,break用于跳出循环,continue用于跳过本轮循环。
语句格式
- 总长度:一行最多1023个字符
- 注释:以分号“;”开头,也支持C语言的“/” “/”
- 缩进(tab或空格):和注释一样,无实际作用。
- 赋值:每一行的第一个“=”视作赋值号,后面的等于都视作逻辑判断等于。
- 标号:冒号开头的代表label
个人觉得有价值的命令
- 交互命令:
-
clearscreen <int>:清屏。int=0时清屏,int=1时清屏+清缓冲区
-
dispstr <data1> [<data2>....]:在屏幕上输出字符。注意:data如果是数字,会取低8位作为ASCII字符进行打印,而不是把data当成数字打印;在屏幕上输出的字符仅本地可见,对远端没有影响。
-
fluashrecv:清空接收字符缓存。防止wait命令从接收缓存读取到异常字符。
-
gethostname <strvar>:把主机名/IP地址存放到strvar字符串变量里。可以用作日志输出。
-
logclose:关闭日志文件
-
logopen <filename> <binary flag> <append flag> [<plain text flag> [<timestamp flag> [<hide dialog flag> [<include screen buffer flag> [<timestamp type]]]]]:把收到的字符输出到filename文件中,后面都是flag。
- filename:不指定目录的时候,默认输出到teraterm的当前目录(可用changedir变更)
- binary flag:0-CR转换为CRLF,转义符被剔除;1-不转换,收到什么存什么
- append flag:0-创建新文件,覆盖现有文件;1-创建新文件,在现有文件追加
- plain text flag:1-非ASCII可见字符不输出到log。
(一般下面不用看)
- timestamp flag:1-在每一行log加入时间戳
- binary flag:1-忽略plain text flag和timestamp flag
- hide dialog flag:1-不显示Log对话框
- include screen buffer flag:1-当前屏幕缓冲区在log打开后立即写入log
- timestamp type:时间戳类型。例如0-本地时间,1-UTC时间
-
logpause:接下来收到的字符不要写入log。和logstart配合使用,logstart恢复log记录。
-
logwrite <string>:写一句string到log,string不能是空的。
-
send <data1> <data2>....:发送字符。data里面有整数时,取整数的低8位视作ASCII字符进行发送。
-
sendln <data1> <data2>....:发送字符,最后加一个回车。
-
wait <string1> [<string2> ...]:等待最多10个字符串中任意一个的出现。字符串为空时代表一个任意字符。系统变量timeout/mtimeout大于零时代表最长等待时间。等待结果存放在系统变量result中,0为超时,n为第n个字符串出现了。
-
waitln <string1> [<string2> ...]:以行为单位的wait。
-
wait4all <string1> [<string2> ...]:等待10个字符串的同时出现。
-
waitevent <events>:等待event出现,例如events=4时代表disconnect。
-
waitrecv <sub-string> <len> <pos>:等待接收到满足某个条件的字符串。条件具体指的是总长为len,从pos位置开始是sub-string。
-
waitregex <string1 with regular expression> [<string2 with regular expression> ...]:等一个符合正则表达式的字符串出现。
- 控制语句:
- pause <time>:像其他语言中的sleep,等待time秒。
- 字符串操作:
- int2str <strvar> <integer value>:整数转字符串。
- str2int <intvar> <string>:字符串转整数。
- sprintf FORMAT [ARGUMENT ...]:类似c语言sprintf,输出格式字符串到系统变量inputstr中。
- sprintf2 strvar FORMAT [ARGUMENT ...]:类似c语言sprintf,输出格式字符串到变量strvar中。