51Testing软件测试论坛

标题: 一个VBS脚本调用另一个VBS脚本 [打印本页]

作者: ham301    时间: 2008-4-25 17:12
标题: 一个VBS脚本调用另一个VBS脚本
写一个脚本列如
    dim str
   str="asfasfasdfasdf"
   call sub_output(str)
   public sub sub_output(str)
       MsgBox(str)
   end sub
保存,"E\aaa.vbs"
打开另一个脚本,
set a=createobject("wscript.shell")
a.run "E\aaa.vbs"
运行这个脚本就可以输出"asfasfasdfasdf"

现在,我想知道:
假如写一个脚本列如
   public sub sub_output(str)
       MsgBox(str)
   end sub
保存,"E\aaa.vbs"
当然也可以写成一个类
class classA
     public sub sub_output(str)
       MsgBox(str)
     end sub
end class

怎么才能实现在另一个脚本里调用它,比如这样
set a=new classA
str1="asdfasf"
a.sub_output(str1)
在vbs里面可以实现吗,怎么实现?请解答!
(网上没找到,寄希望于此了)
作者: 假装不在    时间: 2008-4-25 17:50

如果你想写成一个类的方法,那么你必须先把这个VBS加载进QTP中。
加载有很多种方法。
作者: ham301    时间: 2008-4-25 18:12
原帖由 假装不在 于 2008-4-25 17:50 发表

如果你想写成一个类的方法,那么你必须先把这个VBS加载进QTP中。
加载有很多种方法。

你没有明白我的意思.我的意思就是一个VBS脚本调用另一个VBS脚本.不是在QTP里调用VBS脚本.
我知道可以写一些共通的功能函数,在TestSetting的Resources里载入,那么在QTP里录制脚本的时候就可以直接调用了.
我的意思就是:
   像C或C++里面那样,#include "XXXXXXXXX"
  那么在当前的代码里面就可以调用XXXXXXXXX里的东西了.在VBS里面可不可以这样调用?
用 set a=createobject("wscript.shell")
a.run "XXXX.vbs"
这不是调用,这是运行XXXX.vbs,这样根本无法实现值的传递的(除非先将值写入文件,再在被运行脚本里读文件)
作者: walker1020    时间: 2008-4-25 23:10
为什么需要两个VBS文件? 把所有的内容都写在一个 VBS文件里面不就好了?
作者: hsjzfling    时间: 2008-4-26 02:02
原帖由 walker1020 于 2008-4-25 23:10 发表
为什么需要两个VBS文件? 把所有的内容都写在一个 VBS文件里面不就好了?


就像为什么要多个Action,多个Test一样~
作者: 假装不在    时间: 2008-4-26 02:54
原帖由 ham301 于 2008-4-25 18:12 发表

你没有明白我的意思.我的意思就是一个VBS脚本调用另一个VBS脚本.不是在QTP里调用VBS脚本.
我知道可以写一些共通的功能函数,在TestSetting的Resources里载入,那么在QTP里录制脚本的时候就可以直接调用了.
我的意思 ...



不是我没明白,是你没明白。
我说的多种加载方法,它包含了前台加载和语句的加载方法,前台加载的和你说的一样,如果函数加载的,可以这么写:
ExecuteFile ".....vbs"
放心的用吧。这种方法,建议每次函数调用别太多,因为他都会去编译它,虽然写错了也不会报错(不和直接加载一样,会先编译一次。),但如果函数量太多,它就会停在那里数秒不动。到了工程后期,这个东西停在那里会直到超时。谢谢。
作者: hsjzfling    时间: 2008-4-26 11:01
原帖由 假装不在 于 2008-4-26 02:54 发表



不是我没明白,是你没明白。
我说的多种加载方法,它包含了前台加载和语句的加载方法,前台加载的和你说的一样,如果函数加载的,可以这么写:
ExecuteFile ".....vbs"
放心的用吧。这种方法,建议每次函数 ...


还是你没明白。。。
VBS中是没有ExecuteFile函数的,这个是QTP定义的函数,只能通过QTP来运行。
LZ要问的是在不运行QTP的时候,如何在一个VBS中"Include"另一个VBS文件

PS:事实上,前天我也问了不少朋友这个问题未果,不料昨天也有人提问相同的问题。。。相信肯定有解决方法,就像QTP提供的ExecuteFile~~
作者: 假装不在    时间: 2008-4-26 11:38

这么说,这个函数也只是在QTP中运行才有效?
但我是写了一个VBS在负责管理和导入所有函数的。因此每次只要写导入这条,其他函数就都可以用了。
我觉得楼主在QTP板块问的,应该是在QTP运行时候的。哈哈
作者: ham301    时间: 2008-4-26 13:50
原帖由 walker1020 于 2008-4-25 23:10 发表
为什么需要两个VBS文件? 把所有的内容都写在一个 VBS文件里面不就好了?

如果在一个VBS里面写个好几百行,那看起来就行不方便。要是能够按功能之类的划分,再在文件之间调用,那看起来就比较清晰了。
作者: 假装不在    时间: 2008-4-26 17:02
我说哪么多,你还没说谢谢呢。
作者: ham301    时间: 2008-4-26 18:20
原帖由 假装不在 于 2008-4-26 17:02 发表
我说哪么多,你还没说谢谢呢。

可是我的问题还没有解决啊。
我送了你一朵小花没看到吗,太伤心了
作者: hsjzfling    时间: 2008-4-26 20:01
原帖由 ham301 于 2008-4-26 18:20 发表

可是我的问题还没有解决啊。
我送了你一朵小花没看到吗,太伤心了


偏心啊~~
作者: 假装不在    时间: 2008-4-27 16:40
原帖由 hsjzfling 于 2008-4-26 20:01 发表


偏心啊~~



羡慕不来D
作者: 陈能技    时间: 2008-4-27 18:09
看来需要写成WSC,例如:
<?xml version="1.0"?>
<component>

<?component error="true" debug="true"?>
<reference object="Scripting.Dictionary" />
<registration description="Functions" progid="MyProg" version="1.00" classid="{d7c40957-00d4-41a5-a87b-89d1db311425}">
</registration>

<public>
<property name="pID" get = "GetID" put = "SetID"/>
<method name="SetID" internalName="SetID" dispid="0">
        <parameter name="sValue"/>
</method>
<method name="GetID">
</method>
<method name="PrintMessage">
        <parameter name="strMessage"/>
</method>
</public>

<script language = "VBScript">
<![CDATA[
        Dim pID
        Function GetID()
                GetID = pID
        End Function
        Function SetID(sValue)
                pID = sValue
        End Function
        Function PrintMessage(strMessage)
                Msgbox strMessage
        End Function
        ]]>
</script>

</component>

保存成WSC文件,例如WSCTest1.wsc,然后右键选择文件,注册后就可在另外一个VBS文件中用如下方式访问其中的类:
Set test=CreateObject("MyProg")
test.PrintMessage("Hello!")
作者: ham301    时间: 2008-4-27 23:01
首先,谢谢,这样的确解决了。可是总觉的应该有比较简单直接的方法,上面只是在WSC中嵌入了VBscript脚本!
作者: gy21st    时间: 2008-4-28 16:31
这里有一篇文章写得比较全面,可以参考一下。
http://hi.baidu.com/myvbscript/b ... 6e83014b90a7be.html
作者: mstiunicon    时间: 2008-4-29 01:10
原帖由 gy21st 于 2008-4-28 16:31 发表
这里有一篇文章写得比较全面,可以参考一下。
http://hi.baidu.com/myvbscript/b ... 6e83014b90a7be.html


之前找了很久vbs文件互相调用的方法,都没找到。到后来还是使用了QTP的ExecuteFile函数才解决的。看了这个帖子后,才发现原来有这么多方式。
作者: hsjzfling    时间: 2008-4-29 10:00
相当不错,学习了~~
作者: heqingbluesky    时间: 2008-4-29 11:01
看来除了ExecuteFile函数后,还有另外一个方式调用VBS file,学习了。
作者: zitong    时间: 2008-5-5 14:35
恩,学习到非常有用的东西,非常感谢!
作者: willian0200    时间: 2008-5-7 11:28
看了通篇的讨论 长见识了  长知识了 谢谢大家分享
作者: fish_yy    时间: 2008-5-7 12:02

作者: 小南    时间: 2008-5-7 15:04
WSC里用cstring,不然2003上会跳确认框
作者: 没有蛀牙    时间: 2008-5-7 15:47
要include另一个vbs,可以这样写:
' Includes a file in the global namespace of the current script.
' The file can contain any VBScript source code.
' The path of the file name must be specified absolute (or
' relative to the current directory).
Private Sub IncludeFile(ByVal FileName)
    Dim fso: set fso = CreateObject("Scripting.FileSystemObject")
    Const ForReading = 1
    Dim f: set f = fso.OpenTextFile(FileName,ForReading)
    Dim s: s = f.ReadAll()
    ExecuteGlobal s
End Sub

IncludeFile "CreateNode.vbs"
作者: RayTM    时间: 2008-5-9 11:17
按照第16楼链接的方法:
写一个脚本,
class classA
     public sub sub_output(str)
       MsgBox(str)
     end sub
end class
保存,"E:\aaa.vbs"
再写一个脚本,
Include "E:\bbb.vbs"
set a=new classA
str1="asdfasf"
a.sub_output(str1)
Sub Include(sInstFile)
   Dim oFSO, f, s
   Set oFSO = CreateObject("Scripting.FileSystemObject")
   Set f = oFSO.OpenTextFile(sInstFile)
   s = f.ReadAll
   f.Close
   ExecuteGlobal s
End Sub
保存,"E:\bbb.vbs"
最后在QTP中运行bbb.vbs就可以了吧。

[ 本帖最后由 RayTM 于 2008-5-9 11:21 编辑 ]
作者: xiatian831621    时间: 2008-5-16 16:55
标题: ding
studying..
作者: 远野志贵    时间: 2008-8-20 07:47
这资料真是及时啊,差点就因为这个小问题挂了。
作者: wugecat    时间: 2009-12-14 14:28
up
作者: robinsgl    时间: 2009-12-22 16:08
原帖由 mstiunicon 于 2008-4-29 01:10 发表


之前找了很久vbs文件互相调用的方法,都没找到。到后来还是使用了QTP的ExecuteFile函数才解决的。看了这个帖子后,才发现原来有这么多方式。

同感!
作者: haiwa957    时间: 2009-12-29 15:30
16楼给的连接的那篇文章很不错,我顶,我狂顶
作者: rwxyxy    时间: 2010-3-19 13:12
学习了,谢谢16楼的推荐;
作者: zhengpeipei    时间: 2010-3-19 15:37
路过
作者: zhengpeipei    时间: 2010-3-19 15:39

作者: 17800455    时间: 2010-9-24 21:56
在VBScript中,可以用ExecuteGlobal语句来在一个脚本文件中加载另外一个脚本的函数,例如,假设需要加载的是脚本Test.vbs:
Function Test1
Msgbox "Test1"
End Function

那么可以在脚本ExecuteGlobal.vbs中按下面的方式加载并调用Test1函数:
Set fso = CreateObject("Scripting.FilesyStemObject")
Str = fso.OpenTextFile("Test.vbs", 1).ReadAll
ExecuteGlobal Str
Set fso = Nothing

Test1


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Testing_is_ ... /01/19/5214523.aspx
作者: ouyangxu    时间: 2011-3-31 22:27
怎么我哪个总是报错

ExcuteGlobal s
这句的时候,总是报s错误




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2