【问题标题】:ActiveTCL - Unable to run a batch file from an Expect ScriptActiveTCL - 无法从 Expect 脚本运行批处理文件
【发布时间】:2012-06-26 17:54:31
【问题描述】:

我最初尝试使用以下命令从 Expect 运行可执行文件 (tftpd32.exe),但由于某些未知原因,它会挂起整个脚本:

exec c:/tftpd32.351/tftpd32.exe

所以,决定调用一个批处理文件来启动可执行文件。

我尝试使用以下命令调用批处理文件,但收到一条错误消息,指出 windows 找不到该文件。

exec c:/tftpd32.351/start_tftp.bat

我也尝试了以下方法,但它没有启动可执行文件:

spwan cmd.exe /c c:/tftpd32.351/start_tftp.bat

批处理文件包含这个,当我双击它时它运行正常:

start tftpd32.exe

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 我想“spwan”对任何人来说都不是一个非常有效的命令。同时,请发布一些properly formatted 代码和所有相关错误消息,以改善您的问题。

标签: scripting batch-file tcl expect activetcl


【解决方案1】:

从 Tcl 运行该程序的正确方法是:

set tftpd "c:/tftpd32.351/tftpd32.exe"
exec {*}[auto_execok start] "" [file nativename $tftpd]

请注意,在使用 start 时,您应该始终有多余的空参数(由于 start 的工作方式很奇怪;它有一个可选的引号字符串,用于指定要创建的窗口标题,但它往往会误解第一个带引号的字符串,即使它没有强制参数)并且您需要使用可执行文件的本机系统名称来运行,因此file nativename

如果您的 expect 程序(8.4 或更早版本)中有旧版本的 Tcl,您可以这样做:

set tftpd "c:/tftpd32.351/tftpd32.exe"
eval exec [auto_execok start] [list "" [file nativename $tftpd]]

那个奇怪的eval exec 构造中的list 命令添加了一些必要的引用,否则您将无法生成这些引用。完全按照上面的方法使用它,否则你会得到非常奇怪的错误。 (或者升级到几乎不需要那么多代码体操的东西;添加{*} 语法是有充分理由的!)

【讨论】:

  • 我将可执行文件的名称放在引号中只是为了更好地突出显示,并将它放在一个变量中,因为这样可以使实际代码行更短且更易于阅读。
  • 谢谢,成功了。我还添加了“&”以在后台运行该进程。
  • @atomicluis 这可能没有必要:start 本身就是背景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2013-10-20
相关资源
最近更新 更多