使用expect通过Interactive安装程序循环

时间:2018-04-26 17:17:30

标签: expect

我正在尝试使用expect自动化交互式安装程序的屏幕输入,并希望使用循环通过答案文件的行作为部分安装程序的输入。

安装程序有几个部分,其中一些部分可以通过简单的期望/发送响应轻松处理。但是,安装程序中有一个部分循环询问数据,直到您按一个键完成输入。然后安装程序的其余部分继续。

循环部分在屏幕上显示如下:

SELECT CASE WHEN (LEN(field) >= 6 AND LEN(field) <= 10) 
       THEN field 
       ELSE '' END as 'YourField'
FROM nameoftable

上述部分期望脚本如下所示:

-------------------------------------------------------------------------------------------
Please enter ID details:
Please select an option: [A]dd [D]elete [I]mport [E]xport [F]inish =>A

Path: /opt/scanner/REF1/dump 
ID: REF1


Please enter ID details:
Please select an option: [A]dd [D]elete [I]mport [E]xport [F]inish =>A

Path: /opt/scanner/REF2/dump 
ID: REF2

Please select an option: [A]dd [D]elete [I]mport [E]xport [F]inish =>F

Rest of installer....
-------------------------------------------------------------------------------------------

请原谅我没有使用期望的冗长。这有效,但效率不高。

理想情况下,答案文件包含REF1,REF2,直到EOF(每行一个)和一个循环来读取每一行并发送到屏幕。

我已经看到了这个solution,但不确定这是如何与上述相符的。

我一直在玩这个可能形成解决方案的Tcl代码?

expect -exact "Please select an option: \[A\]dd \[D\]elete \[I\]mport \[E\]xport \[F\]inish =>"
send -- "A\r"

expect -exact "Path: "
send -- "/opt/scanner/REF1/dump"
expect -exact "/opt/scanner/REF1/dump"
send -- "\r"


expect -exact "Please select an option: \[A\]dd \[D\]elete \[I\]mport \[E\]xport \[F\]inish =>"
send -- "A\r"

expect -exact "Path: "
send -- "/opt/scanner/REF2/dump"
expect -exact "/opt/scanner/REF2/dump"
send -- "\r"

expect -exact "Please select an option: \[A\]dd \[D\]elete \[I\]mport \[E\]xport \[F\]inish =>"
send -- "F\r"

其中$ LINE是REF1,来自答案文件的REF2。

提前致谢。

1 个答案:

答案 0 :(得分:0)

减少冗长的第一件事是:将提示放入变量;发送带有路径的回车。

set prompt "Please select an option: \[A\]dd \[D\]elete \[I\]mport \[E\]xport \[F\]inish =>"

expect -exact $prompt
send -- "A\r"
expect -exact "Path: "
send -- "/opt/scanner/REF1/dump\r"

expect -exact $prompt
send -- "A\r"
expect -exact "Path: "
send -- "/opt/scanner/REF2/dump\r"
send -- "\r"

expect -exact $prompt
send -- "F\r"

我们可以把它放到一个循环中,但它增加了一些复杂性

set refs [list "REF1" "REF2"]
set count 0
expect $prompt {
    if {$count == 2} {
        send -- "F\r"
    } else {
        send -- "A\r"
        expect -exact "Path: "
        set ref [lindex $refs $count]
        send -- "/opt/scanner/$ref/dump\r"
        incr count
        exp_continue
    }
}

exp_continue命令&#34;循环&#34;回到&#34;外部&#34;期待命令。