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
Конструкция добавляет некоторые необходимые цитаты, которые вы бы не смогли создать в противном случае. Используйте его точно так же, как описано выше, иначе вы получите очень странные ошибки. (Или перейти на что-то, где вам не нужно почти столько же гимнастики кода; {*}
синтаксис был добавлен не зря!)