【问题标题】:How to run multiple TCL scripts in same tclsh window?如何在同一个 tclsh 窗口中运行多个 TCL 脚本?
【发布时间】:2016-09-16 12:20:10
【问题描述】:

说明

  1. 我使用 VBScript
  2. 从 VBScript 我将我的第一个 TCL 脚本称为“name1”
  3. 脚本“name1”完成后,我继续使用 VBScript
  4. 经过几个 VBScript 函数后,我将第二个 TCL 脚本称为“name2”,该脚本是脚本“name1”的子进程。脚本“name2”必须使用脚本“name1”中的所有变量

当前结果

我的脚本“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" 

结束子

name1.tcl

软件包要求 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 从 VB 脚本调用 tcl 命令

但是没有人在工作

好消息,它开始工作了,但是,我更喜欢通过 API 执行单独的 TCL 文件

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

【问题讨论】:

  • 如果您希望代码被分析并得到帮助,您真的应该发布代码;不然这里的人都是瞎操作……

标签: vbscript tcl


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2014-03-13
    • 2016-07-18
    • 2015-08-15
    • 1970-01-01
    相关资源
    最近更新 更多