Scripting ActiveTCL-无法从Expect脚本运行批处理文件

Scripting ActiveTCL-无法从Expect脚本运行批处理文件,scripting,batch-file,tcl,expect,activetcl,Scripting,Batch File,Tcl,Expect,Activetcl,我最初尝试使用以下命令从Expect运行一个可执行文件(tftpd32.exe),但由于未知原因,它会挂起整个脚本: exec c:/tftpd32.351/tftpd32.exe 因此,决定调用一个批处理文件来启动可执行文件 我尝试使用以下命令调用批处理文件,但收到一条错误消息,说明windows找不到该文件 exec c:/tftpd32.351/start_tftp.bat 我还尝试了以下操作,但它不会启动可执行文件: spwan cmd.exe /c c:/tftpd32.351/s

我最初尝试使用以下命令从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
任何帮助都将不胜感激


谢谢

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

set tftpd "c:/tftpd32.351/tftpd32.exe"
exec {*}[auto_execok start] "" [file nativename $tftpd]
请注意,在使用
start
时,您应该始终有一个额外的空参数(因为
start
的工作方式很奇怪;它在引号中有一个可选字符串,用于指定要创建的窗口标题,但它往往会将第一个带引号的字符串误解为空,即使没有强制参数)您需要使用要运行的可执行文件的本机系统名称,因此需要使用
文件nativename

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

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

在这个奇怪的
eval exec
结构中的
list
命令添加了一些必要的引用,否则您将很难生成这些引用。完全按照上面的方法使用,否则会出现非常奇怪的错误。(或者升级到不需要太多代码练习的地方;添加
{*}
语法是有充分理由的!)

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

set tftpd "c:/tftpd32.351/tftpd32.exe"
exec {*}[auto_execok start] "" [file nativename $tftpd]
请注意,在使用
start
时,您应该始终有一个额外的空参数(因为
start
的工作方式很奇怪;它在引号中有一个可选字符串,用于指定要创建的窗口标题,但它往往会将第一个带引号的字符串误解为空,即使没有强制参数)您需要使用要运行的可执行文件的本机系统名称,因此需要使用
文件nativename

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

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

在这个奇怪的
eval exec
结构中的
list
命令添加了一些必要的引用,否则您将很难生成这些引用。完全按照上面的方法使用,否则会出现非常奇怪的错误。(或者升级到不需要太多代码练习的地方;
{*}
语法的添加是有充分理由的!)

我想“spwan”对任何人来说都不是一个非常有效的命令。同时,请通过发布一些代码和所有相关错误消息来改进您的问题。我认为“spwan”对任何人来说都不是一个非常有效的命令。同时,请通过发布一些代码和所有相关的错误消息来改进您的问题。我将可执行文件的名称加引号只是为了更好地突出显示,并将其放在变量中,这样可以使真正的代码行更短,更易于阅读。谢谢,这很有效。我还添加了“&”以在后台运行该进程。@atomicluis这可能不是必需的:
start
本身就是背景。我将可执行文件的名称加上引号只是为了更好地突出显示,并将其放在一个变量中,因为这样可以使真正的代码行更短,更易于阅读。谢谢,这很有效。我还添加了“&”以在后台运行该进程。@atomicluis这可能不是必需的:
start
本身就是背景。