如何在同一个tclsh窗口中运行多个TCL脚本?

时间:2016-05-19 14:27:14

标签: vbscript tcl

描述

  1. 我使用VBScript
  2. 从VBScript我调用我的第一个TCL脚本“name1”
  3. 脚本“name1”完成后,我继续使用VBScript
  4. 在几个VBScript函数之后,我调用了我的第二个TCL脚本“name2”,这个脚本是脚本“name1”的子进程。脚本“name2”必须使用脚本“name1”
  5. 中的所有变量

    当前结果

    我的脚本“name1”和“name2”正在不同的tclsh窗口中执行 因此,“name2”不熟悉“name1”

    的变量

    预期结果

    “name1”和“name2”在同一个tclsh窗口中执行

    注释

    我尝试使用这些命令,但我不知道它在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 :: create project]

    设置hTxPort [stc :: create port -under $ hProject -location //192.168.0.243/10/17 -useDefaultHost False]

    name2.tcl

    设置hRxPort [stc :: create port -under $ hProject -location //192.168.0.243/10/25 -useDefaultHost False]

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

    因此,我看到此消息:错误:ActiveX组件无法创建对象'c:\ tcl \ bin \ tcl84.dll'

    我可以使用2个选项:

    1. 从我的VB脚本中调用tcl文件
    2. 通过dll
    3. 从VB脚本调用tcl命令

      但没人在工作

      好消息,它开始有效,但是,我更愿意通过API执行单独的TCL文件

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

1 个答案:

答案 0 :(得分:0)

tcl84.dll不是提供COM类的东西。您不能使用像这样的VBScript CreateObject调用来创建Tcl解释器。 VBScript没有直接从DLL访问导出函数的机制,因此除非执行tclshwish进程,否则无法从VBScript运行Tcl代码。

每次执行tclsh.exe scriptfile时,您都会创建一个新的子进程。它将运行您的脚本但是当它退出时,进程终止并且除非您读取标准输出或将信息写入文件以保留它,否则有关它的所有内容都将丢失。所以运行第二个脚本当然不会知道第一个脚本。

将两个tcl脚本一起运行的一种方法是创建一个脚本,该脚本使用tcl source命令将两个脚本加载到单个解释器中。另一种方法可能是读取第一个脚本的输出,解析出您需要的值,并将这些值作为命令行参数传递给第二个脚本。或者你可以让第一个脚本编写一个tcl命令文件,当在第二个进程中获取时,它将更新你需要的变量。

您的最后一个示例是创建单个进程并通过模拟键击进行通信。这非常缓慢且容易出错。有一个winsend包可以让你从vbscript向tcl解释器发送消息。 TWAPI中可能还有其他一些可以让您注册解释器以进行外部访问。

相关问题