0

当我尝试在 Windows ( )can't set "::exp::winnt_debug": parent namespace doesn't exist上使用期望解释器的 C 实现运行我的期望脚本时,我收到错误“ ”。expect543.dll但是,如果我通过 ActiveState 命令tclsh运行相同的脚本...

脚本中的“”语句set ::exp::winnt_debug 1是错误的原因。知道可能是什么原因以及如何解决它?

请在下面找到代码

package require Expect
set ::exp::winnt_debug 1
set prompt "R4#"
set more " --More--"
expect -timeout 10 "$prompt"
set output [open result.txt "w"]
set running 1
spawn plink -telnet "144.21.12.45" -P 2004
send "enable\r"
send "\r"
send "show running-config\r"
send "\r"
while { $running  > 0 } {
expect {
    "\n"    { puts -nonewline $output "$expect_out(buffer)" }
    "$more"    {send " "}
    "lines *-* " { send " " }
    #"$prompt"   { set running 0 }
    eof     { set running 0 }
    timeout     { set running 0 }
}

}
puts "output is .."
4

1 回答 1

0

Windows 上的 Expect 可能有多种实现(与多年来稳定的 Unix 版本不同),听起来它们在内部如何实现的细节在它们之间有很大差异。这并不特别令人惊讶。此外,该变量::exp::winnt_debug绝对是特定实现的内部变量。

直接的解决方法是将出现错误的行更改为:

catch {set ::exp::winnt_debug 1}

像这样,如果它失败了,它会默默地失败,并且不会导致程序的其余部分无法运行。(启用调试对代码是否运行没有任何影响!)

更一般地说,要么使用 ActiveState 构建(并弄清楚如何以正确的方式将事物打包在一起,记住关键的依赖关系),要么停止引用它的内部特性。在包的实现中戳你的手指是非常糟糕的形式,因为没有人承诺支持它们。

于 2013-08-06T12:59:27.723 回答