如何在Tcl中使用带有期望的if语句进行telnet?

问题描述 投票:0回答:1

自动 telnet 届时得到天气。

thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ tclsh main.tcl 


connect to wunderground with:
-----------------
1)  noControlFlow
2)  connect


1
spawn telnet rainmaker.wunderground.com
getting weather for nyc
Trying 35.160.169.47...
Connected to rainmaker.wunderground.com.
Escape character is '^]'.
------------------------------------------------------------------------------
*               Welcome to THE WEATHER UNDERGROUND telnet service!            *
------------------------------------------------------------------------------
*                                                                            *
*   National Weather Service information provided by Alden Electronics, Inc. *
*    and updated each minute as reports come in over our data feed.          *
*                                                                            *
*   **Note: If you cannot get past this opening screen, you must use a       *
*   different version of the "telnet" program--some of the ones for IBM      *
*   compatible PC's have a bug that prevents proper connection.              *
*                                                                            *
*           comments: [email protected]                              *
------------------------------------------------------------------------------

Press Return to continue:

Press Return for menu
or enter 3 letter forecast city code-- nyc
Weather Conditions at 03:51 AM EDT on 10 May 2020 for New York JFK, NY.
Temp(F)    Humidity(%)    Wind(mph)    Pressure(in)    Weather
========================================================================
  40          55%         WEST at 20       30.08      Partly Cloudy

Forecast for New York, NY
319 am EDT sun may 10 2020

.Today...Sunny. Highs in the lower 60s. West winds 15 to 20 mph. 
.Tonight...Mostly cloudy. A chance of showers after midnight.
Lows in the upper 40s. Southwest winds 15 to 20 mph, diminishing
to 5 to 10 mph after midnight. Chance of rain 30 percent. 
.Monday...Mostly cloudy with a chance of showers. A slight chance
of thunderstorms in the afternoon. Highs in the lower 60s. West
winds 10 to 15 mph. Chance of rain 50 percent. 
.Monday night...Mostly cloudy with a slight chance of showers in
the evening, then mostly clear after midnight. Lows in the lower
40s. Northwest winds 15 to 20 mph. Chance of rain 20 percent. 
.Tuesday...Sunny. Highs in the upper 50s. Northwest winds 10 to
15 mph. 
.Tuesday night...Partly cloudy. Lows in the lower 40s. 
.Wednesday...Sunny. Highs in the lower 60s. 
.Wednesday night...Mostly clear in the evening, then becoming
   Press Return to continue, M to return to menu, X to exit: thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 

代码:

package provide weather  1.0
package require Expect

namespace eval ::wunderground {
}

#works
proc ::wunderground::noControlFlow {city} {
    variable telnet [spawn telnet rainmaker.wunderground.com]
    puts "getting weather for $city"

    expect "Press Return to continue:"
    send "\r"

    expect "or enter 3 letter forecast city code--"
    send "$city\r"

    expect "X to exit"
    send "x"


}

我怎样才能在上面的脚本中加入一些逻辑或控制流程?

例如,要打印几个硬编码的城市,从它的? proc 本身,并呈现一个菜单,以数字方式从中选择?

类似于 main 脚本。

lappend auto_path /home/thufir/NetBeansProjects/spawnTelnet/telnet/weather
package require weather 1.0


puts "\n\nconnect to wunderground with:"
puts "-----------------"
puts "1)\tnoControlFlow"
puts "2)\tconnect\n\n"


set a [gets stdin]


if {$a == 1 } {
   wunderground::noControlFlow "nyc"
} else {
   wunderground::connect "nyc"
}

是的,很明显,wunderground提出了一个城市的菜单来选择。 只是想增加一些分支,以利于教育。

寻找 浸入和退出互动模式 与,我相信,一个 -i 开启 expect 声明。

我已经把 man 的页面到我的kindle上,正在考虑购买期望的书。

if-statement tcl expect telnet control-flow
1个回答
1
投票

你可以使用正常的Tcl控制流结构,如 ifforeach 与Expect命令。(你已经通过使用 proc.) 唯一真正棘手的一点(特别是循环和Expect)是,你需要考虑你正在做的事情与你正在自动化的事情。

你最终得到的可能是 东西 像这样。

proc ::wunderground::multipleCities {args} {
    variable telnet [spawn telnet rainmaker.wunderground.com]
    puts "getting weather for $city"

    expect "Press Return to continue:"
    send "\r"

    foreach city $args {
        expect "or enter 3 letter forecast city code--"
        send "$city\r"
    }

    expect "X to exit"
    send "x"
}

除了我认为你可能应该以某种方式来构建 expect 循环后的 send,在概念上,这样你就可以处理获取某个城市的值的结果。你可能需要确定一个常见的稳定提示,在获取数据后,你会回来。

© www.soinside.com 2019 - 2024. All rights reserved.