VBS - 创建对象并通过函数和子函数传递它?

时间:2011-03-24 11:35:49

标签: arrays object vbscript return

我正在尝试一些事情。我有这个系统,在某些事件处理程序中触发了一堆脚本。在Active Directory中创建用户时使用此选项。

所以,我认为我需要的是一个基本上收集正在处理的用户的属性的函数 - 希望是一个对象。然后返回该对象并在其他函数和subs中使用它。这样我就可以使用“myObject.firstname”来达到我想要的属性,就是这样。

如何创建对象,在其中创建和设置值以及返回整个对象?这在VBS中是否可行?

编辑:如果我可以创建一个包含这些属性的对象,并且只要我需要就可以访问它们,那将是最好的。

我基本上是这样的:

Public Sub Main()
   Set userStream = New objUser
   msgbox objUser.firstname
   msgbox objUser.lastname
   msgbox objUser.username
End Sub

编辑:为了解释更多,我有这个名为'libGetUserProperties'的库脚本 这是我想要的功能和类。然后我只是在运行时运行的实际脚本中导入这个库脚本。看起来像这样:

libGetUserProperties:

Public Function getobjUser(ByRef Request, ByVal From)
    Dim thisUserObject
    Set thisUserObject = New objUser

    'If type = 0, data comes from AD
    If From = 0 Then
        thisUserObject.firstname = "some string"
        thisUserObject.lastname = "some string"  
    End If

    'If type = 1, data comes from Request stream
    If From = 1 Then
        thisUserObject.firstname = "some string"
        thisUserObject.lastname = "some string"    
    End If    

    Set getobjUser = thisUserObject

End Function

Class objUser
    Public firstname 
    Public lastname 
    Public username 
End Class' 

这是实际的运行时脚本的样子:

Dim libGetUserProperties
Set libGetUserProperties = ScriptLib.Load("Script Modules/Library Scripts/libGetUserProperties")

Sub onPreCreate(Request)

    Dim userStream
    Set userStream = New objUser
    'Do whatever with objUser which contains all of the properties I'm after
End Sub

2 个答案:

答案 0 :(得分:2)

使用VBScript是不可能的,除非您想动态生成类的代码,包括属性,将其保存到文件,然后将该文件作为脚本执行。

使用JScript这样做要容易得多。由于Windows Scripting可以处理JScript以及VBScript,我建议采用这种方式。

如果您肯定需要VBScript,那么您可以使用的最好的是Scripting.Dictionary,其中包含属性作为键:

Dim dicUser
dicUser = CreateObject("Scripting.Dictionary")
dicUser("FirstName") = objUser.FirstName

允许您访问第一个名称,如下所示:

dicUser("FirstName")

<强>更新

如果你想编写一个创建字典并返回它的函数,这是在VBScript中这样做的方法:

Function RememberTheUser(Request)
    Dim dicResult
    Set dicResult = CreateObject("Scripting.Dictionary")
    dicResult("FirstName") = Request.GetTheFirstName
    Set RememberTheUser = dicResult
End Function

然后可以将其分配给其他变量:

Dim dicUser ' in the main section of the script, this means it's a global variable

Sub onPreCreate(Request)
  ' ...
  Set dicUser = RememberTheUser(Request)
  ' ...
End Sub


Sub onSomethingLater()
  WScript.Echo dicUser("FirstName") ' It's still accessible here
End Sub

在JScript中,它更容易:只需创建一个新对象,并添加新属性。

function readObject(dataSource) {
     var result = {};
     result.source = dataSource;
     result.firstName = dataSource.firstName;
     result['lastName'] = dataSource.FunctionThatGetsLastName();
}

请注意,在JScript中,可以使用object.property表示法访问对象属性,也可以通过object['property']表示法访问对象属性,这在具有动态命名属性时非常有用。 (第二种表示法中的'property'是一个字符串,可以被任何返回字符串的表达式替换。)

答案 1 :(得分:0)

保持VBScript,断开连接的记录集也可以正常工作,并且可能比字典更快;请参阅here以获取示例。