ActiveTCL - невозможно запустить командный файл из сценария Expect

Я изначально пытался запустить исполняемый файл (tftpd32.exe) из 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

Пакетный файл содержит это, и он работает нормально, когда я дважды щелкаю по нему:

start tftpd32.exe

Любая помощь будет очень высоко ценится.

Спасибо

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]]

list Команда в этом странном eval exec Конструкция добавляет некоторые необходимые цитаты, которые вы бы не смогли создать в противном случае. Используйте его точно так же, как описано выше, иначе вы получите очень странные ошибки. (Или перейти на что-то, где вам не нужно почти столько же гимнастики кода; {*} синтаксис был добавлен не зря!)

Другие вопросы по тегам