我是新手,希望编写脚本,我想写下这样的内容:
set variable;
$variable = expect -exact "\/----Enter Password----\\"
while { != $variable } {
send -- {^[-}
}
我想继续发送转义+连字符,直到我期待这个提示:" / ----输入密码---- \"。我已经写了上面的代码,但它没有用。我该怎么做,请帮助我。
答案 0 :(得分:3)
您可以使用exp_continue
来处理这种情况。命令exp_continue
允许期望自己继续执行而不是像通常那样返回。这对于避免显式循环或重复期望语句很有用。默认情况下,exp_continue
会重置timeout
计时器。如果使用exp_continue
标志调用-continue_timer
,则不会重新启动计时器。
在expect
中,默认超时为10秒。即expect
等待预期字符串出现的时间。
我们曾经在expect
中给出了预期的字符串,如
expect "name"
将等待字符串' name'如果超时发生,则继续下一个语句。要处理超时方案,我们在timeout
本身使用关键字expect
。
expect {
"name" { # Some code here }
timeout { # timeout_hanlder_code_here }
}
您可以使用timeout
命令更改set
值,如下所示。
set timeout 60; # Timeout will happen after 60 seconds.
所以,将所有内容合并在一起,
expect {
# If the phrase 'Enter Password' seen, then it will send the password
"Enter Password" {send "yourpassword\r"}
# If 'timeout' happened, then it will send some keys &
# 'expect' will be looped again.
timeout {send -- {^[-}; exp_continue}
}
注意:我发现您的代码存在问题。您已经提到必须将escape +连字符键一起发送。但是,您只发送文字方括号([
)和连字符(-
)符号。如果它工作那么好,你不需要阅读这个'注意' section.Skip它。否则,请继续阅读以下内容。
您应该将实际的转义字符发送到该程序。它可以作为
完成send -- \033-; # Sending Escape + hyphen together
这是\033
是什么?它是Escape键的八进制代码。然后,我们只是将连字符与它的符号组合为-
,结果为\033-
。所以我们的最终代码将是,
expect {
# If the phrase 'Enter Password' seen, then it will send the password
"Enter Password" {send "yourpassword\r"}
# If 'timeout' happened, then it will send some keys &
# 'expect' will be looped again.
timeout {send -- \033-; exp_continue}
}
参考:Tcl's wiki& ASCII Char Table