scriptingbatch-filetclexpectactivetcl

ActiveTCL - Unable to run a batch file from an Expect Script


I was originally trying to run an executable (tftpd32.exe) from Expect with the following command, but for some unknown reason it would hanged the entire script:

exec c:/tftpd32.351/tftpd32.exe

So, decided to call a batch file that will start the executable.

I tried to call the batch file with the following command, but get an error message stating windows cannot find the file.

exec c:/tftpd32.351/start_tftp.bat

I also tried the following, but it does not start the executable:

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

The batch file contains this and it run ok when I double click on it:

start tftpd32.exe

Any help would be very much appreciated.

Thanks


Solution

  • The right way to run that program from Tcl is to do:

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

    Note that you should always have that extra empty argument when using start (due to the weird way that start works; it has an optional string in quotes that specifies the window title to create, but it tends to misinterpret the first quoted string as that even if that leaves it with no mandatory arguments) and you need to use the native system name of the executable to run, hence the file nativename.

    If you've got an older version of Tcl inside your expect program (8.4 or before) you'd do this instead:

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

    The list command in that weird eval exec construction adds some necessary quoting that you'd have trouble generating otherwise. Use it exactly as above or you'll get very strange errors. (Or upgrade to something where you don't need nearly as much code gymnastics; the {*} syntax was added for a good reason!)