2016-05-19 4 views
0

ОписаниеКак запустить несколько сценариев TCL в одном окне tclsh?

  1. Я работаю с VBScript
  2. От VBScript Я называю свой первый сценарий TCL "name1"
  3. После того как сценарий "name1" закончена, я продолжаю работать с VBScript
  4. После нескольких функций VBScript я вызываю свой второй скрипт TCL «name2», и этот скрипт является дочерним процессом скрипта «name1». Сценарий «name2» должны использовать все переменные из сценария «name1»

Текущий результат

Мои сценарии «name1» и «name2» выполняются в разных tclsh окнах В результате , то «name2» не знаком с переменными «имя1»

Ожидаемый результат

«name1» и «name2» выполнены в том же tclsh Windo ж

Комментарий

Я пытался использовать эти команды, но я не знаю его синтаксис в VBScript

Tcl_Create tclHandler, TCL_Eval Статус, tclHandler,

Было бы неплохо иметь пример использования этих команд в VBScript или любых других

С благодарностью

VBScript:

#$language = "VBScript" 
#$interface = "1.0" 
Const ForReading = 1 
Const ForWriting = 2 
Const ForAppending = 8 
crt.Screen.Synchronous = True 
Sub Main 
dim shell 
    set shell=createobject("wscript.shell") 
    shell.run "tclsh e:\RunTCL\name1.tcl" 
    crt.Sleep 10000 ' or any VBScript commands 
    shell.run "tclsh e:\RunTCL\name2.tcl" 

End Sub

name1.tcl

пакет REQ SpirentTestCenter

набор hProject [STC :: создать проект]

набор hTxPort [STC :: create port -under $ hProject -location //192.168.0.243/10/17 -useDefaultHost False]

name2.tcl

набор hRxPort [STC :: создать порт -под $ hProject -Расположение //192.168.0.243/10/25 -useDefaultHost ложных]

Новый код с tcl84.dll и его команды "TCL_Create tclHandler":

#$language = "VBScript" 
#$interface = "1.0" 
Const ForReading = 1 
Const ForWriting = 2 
Const ForAppending = 8 
crt.Screen.Synchronous = True 
Sub Main 
Dim wscriptTCL 
tclHandler = 0 
set wscriptTCL =CreateObject("C:\Tcl\bin\tcl84.dll") 
TCL_Create tclHandler, wscriptTCL, 1 
puts "Importing STC API" 
TCL_Eval Status, tclHandler, "package req SpirentTestCenter" 
puts "Creating API objects set" 
TCL_Eval Status, tclHandler, "set hProject [stc::create project]" 
puts "Connecting to STC ports" 
TCL_Eval Status, tclHandler, "set hTxPort [stc::create port -under $hProject -location //10.110.10.243/8/9 -useDefaultHost False]" 

src.Sleep 100000 

TCL_Eval Status, tclHandler, "set hRxPort [stc::create port -under $hProject -location //10.110.10.243/8/10 -useDefaultHost False]" 

в результате, я вижу это сообщение: Error: ActiveX компонент не может создать объект «C: \ Tcl \ Bin \ tcl84.длл»

я могу использовать 2 варианта:

  1. вызова файла TCL из моего VB скрипта
  2. команды
  3. Вызов TCL из сценария VB через DLL

Но никто не работает

Хорошие новости, он начинает работать, однако я бы предпочел выполнять отдельные файлы TCL по API

shell.run "tclsh" 
    crt.Sleep 10000 
    shell.AppActivate "tclsh" 
    shell.SendKeys("TCL command") 
+2

Вы действительно должны опубликовать код, если вы ожидаете, что он будет проанализирован и будет оказана помощь; иначе люди здесь работают слепыми ... – Dave

ответ

0

tcl84.dll не является чем-то, что обеспечивает класс COM. Вы не можете создать интерпретатор Tcl, используя вызов VBScript CreateObject следующим образом. VBScript не имеет механизма доступа к экспортированным функциям непосредственно из DLL, поэтому вы не можете запускать свой код Tcl из VBScript, за исключением выполнения процесса tclsh или wish.

Каждый раз, когда вы выполняете tclsh.exe scriptfile, вы создаете новый дочерний процесс. Он запустит ваш скрипт, но когда он выйдет из процесса, будет завершен, и все об этом будет потеряно, если вы не прочитаете стандартный вывод или не напишите информацию в файл, чтобы сохранить его. Таким образом, запуск второго скрипта, конечно, не знает первого скрипта.

Один из способов запуска двух сценариев tcl - создать скрипт, который использует команду tcl source для загрузки обоих сценариев в один интерпретатор. Другой метод может состоять в том, чтобы прочитать вывод первого скрипта, проанализировать нужные значения и передать их как аргументы командной строки ко второму. Или вы могли бы, чтобы первый скрипт написал файл команд tcl, который, когда источник во втором процессе обновит требуемые переменные.

Ваш последний пример - создание единого процесса и передача через эмулируемые нажатия клавиш. Это очень медленно и подвержено ошибкам. Существует пакет winsend, который позволяет отправлять сообщения интерпретаторам tcl из vbscript. Могут быть некоторые другие как часть TWAPI, которые могут позволить вам зарегистрировать интерпретатор для внешнего доступа.