2012-06-25 86 views
1

我本来试图运行从期望使用下面的命令的可执行文件(tftpd32.exe)的批处理文件,但由于一些未知的原因,它会绞死整个脚本:ActiveTCL - 无法运行从expect脚本

exec c:/tftpd32.351/tftpd32.exe 

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

我试图用以下命令调用批处理文件,但得到一个错误消息,指出Windows无法找到该文件。

exec c:/tftpd32.351/start_tftp.bat 

我也试过以下,但它不会启动可执行文件:

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

批处理文件包含这一点,当我双击它运行OK:

start tftpd32.exe 

任何帮助将非常感激。

感谢

+0

我想象“spwan”对任何人都不是一个非常有效的命令。与此同时,请通过发布一些[格式正确的](http://stackoverflow.com/editing-help)代码和所有**相关的**错误消息来改进您的问题。 –

回答

1

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

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

注意,使用start(当你应该始终有额外的空参数由于怪异的方式start工作;它有一个引号中的可选字符串,用于指定要创建的窗口标题,但它倾向于误解第一个带引号的字符串,因为即使没有强制参数,也会导致该问题),并且您需要使用可执行文件的本机系统名称运行,因此file nativename

如果你有Tcl的较旧版本的expect程序中(8.4或之前),你应该这样做,而不是:

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

在怪异eval exec建设list命令添加一些必要的报价是否则会产生问题。完全按照上面的方法使用它,否则会出现很奇怪的错误。 (或者升级到你不需要几乎一样多的代码体操; {*}语法被添加了一个很好的理由!)

+0

我把可执行文件的名字放在引号中,只是为了突出显示,我把它放在一个变量中,因为这样可以使实际的代码行更短,更容易阅读。 –

+0

谢谢,这工作。我还添加了'&'以在后台运行该过程。 – atomicluis

+0

@atomicluis这是_probably_没有必要:'开始'本身背景的东西。 –