我的TCL / Expect脚本:
foreach data $test url $urls {
send "test app website 1\r"
expect "*#"
send "commit \r"
expect "*#"
after 2000
exec cmd.exe /c start iexplore.exe $url
after 3000
exec "C:/WINDOWS/System32/taskkill.exe" /IM IEXPLORE.EXE /F
send "show application stats $data\r"
expect "*#"
expect "?" {
puts [open urllist.txt w] $expect_out(buffer)
}
}
除了将$ expect_out(buffer)的输出存储到文件中之外,上述脚本工作正常。
我想连续将$ expect_out(缓冲区)输出发送到“urllist.txt”文件。
请建议我实现这一目标。
提前致谢。
答案 0 :(得分:1)
以下跟踪过程将expect_out(buffer)的值写入特定于spawn id的文件。
proc log_by_tracing {array element op} {
uplevel {
global logfile
set file $logfile($expect_out(spawn_id))
puts -nonewline $file $expect_out(buffer)
}
}
spawn id和每个日志文件之间的关联是在数组日志文件中进行的,该文件包含一个指向日志文件的指针,该指针基于spawn id。在生成每个过程时,可以使用以下代码进行这种关联。
spawn <some_app_name_here>
set logfile($spawn_id) [open exp_buffer.log w]
必须在代码中添加跟踪
trace variable expect_out(buffer) w log_by_tracing
在内部,expect
命令在spawn_id
元素之后但在X, string
数组中的buffer
元素之前保存expect_out的expect_out
元素。因此,跟踪必须由缓冲区元素而不是spawn_id元素触发。
注意:如果您不了解产生的大部分进程或仅使用一个衍生进程或根本没有衍生进程,那么有一种简单的方法可以做到这一点,那么它会很多容易。
考虑以下示例。
proc log_by_tracing {array element op} {
uplevel {
puts -nonewline $file $expect_out(buffer)
}
}
set file [ open myfile.log w ]
trace variable expect_out(buffer) w log_by_tracing
set timeout 60
expect {
quit { exit 1 }
timeout { exp_continue }
}
如果您运行代码,无论您在控制台中键入什么,直到您键入“退出”,程序将运行并最终将其记录在名为'myfile.log'
您只需将proc log_by_tracing
和trace语句添加到代码中即可。请记住,只需这个简单的方法,就可以保存一个expect_out(缓冲区)实例。
参考:trace,uplevel&amp; EXploring Expect