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

Первоначально я пытался запустить исполняемый файл (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

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

Спасибо


person atomicluis    schedule 25.06.2012    source источник
comment
Я полагаю, что spwan не очень эффективная команда для кого-либо. Тем временем, пожалуйста, улучшите свой вопрос, разместив правильно отформатированный код и все соответствующие сообщения об ошибках точно как они появляются.   -  person Todd A. Jacobs    schedule 26.06.2012


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

person Donal Fellows    schedule 26.06.2012
comment
Я поместил имя исполняемого файла в кавычки только для того, чтобы его было приятно выделить, и я поместил его в переменную, так как это делает реальную строку кода короче и ее легче читать. - person Donal Fellows; 26.06.2012
comment
Спасибо, это сработало. Я также добавил «&», чтобы запустить процесс в фоновом режиме. - person atomicluis; 28.06.2012
comment
@atomicluis В этом вероятно нет необходимости: start сам создает фон. - person Donal Fellows; 28.06.2012