2014-03-26 69 views
0

我想从另一个vbscript执行一个vbscript。思考是,我必须通过一个字典作为参数,但我总是得到相同的错误信息。 这里是我到目前为止的代码:vbs以字典的形式执行另一个vbs脚本作为参数

dim objShell 
Set objShell = Wscript.CreateObject("WScript.Shell") 
dim dicExp 
Set dicExp = CreateObject("Scripting.Dictionary") 
dic.add 0, 10 
objShell.Run "C:\Users\groeschm\Desktop\ODBCAktuell.vbs " & dicString 

但我总是收到此错误信息: 错误800A01C2 - 无效属性赋值的参数个数错误。

问候, 迈克尔

+1

'dicString'从哪里来?它是什么? – TheBlastOne

回答

0

不能传递的对象引用WScript.Shell.Run。见http://msdn.microsoft.com/en-us/library/d5fk67ky(v=vs.84).aspx,它表示命令行参数是一个字符串,没有别的。

您不能传递Scripting.Dictionary引用,也不能将该引用编码到字符串参数中。

就这么简单!

而且,即使你可以,这将是无用的,因为被叫VBS不共享相同的全球范围内的主叫代码

您应该考虑替代Run。您可以将ODBCAktuell.vbs代码放入函数中,然后调用它。或者您考虑ExecuteFile或其中一个相关的内在函数。

(不知道什么ODBCAktuell.vbs包含,并且不知道你正在试图完成什么,也很难进一步建议你比。)

有基于相同布雷恩布格一个类似的问题:Create instance for a class(resides in B.vbs) from another .VBS file

0
  1. OT的代码搞砸了。 dicString未定义。它不会抛出声明的错误,而是一个“Object Required”,因为字典被命名为dicExp,而不是dic
  2. 尽管TheBlastOne正确地声明,除了通过命令行传递字符串之外,不能传递任何东西,但希望传达其他(更复杂)类型的数据是合法的。从命令行参数中创建数字或日期是标准过程。并且:想要通过某种import/using/include机制重新使用代码,这不是一个脑波,但对于良好的编程来说是必不可少的。
  3. 序列化的一般方法(通过字符串)是JSON,但在VBScript中使用它并不容易(cf)。

一个“滚你自己”的简单的情况下方法的起点(S)(用数字/标量/简单的字符串作为键和值的字典)很简单:

字符串化:

cscript passdic.vbs 
cscript recdic.vbs "1 2 3 4" 
1 => 2 
3 => 4 

passdic.vbs:

Option Explicit 

Function d2s(d) 
    ReDim a(2 * d.Count - 1) 
    Dim i : i = 0 
    Dim k 
    For Each k In d.Keys() 
     a(i) = k 
     i = i + 1 
     a(i) = d(k) 
     i = i + 1 
    Next 
    d2s = Join(a) 
End Function 

Function qq(s) 
    qq = """" & s & """" 
End Function 

Dim d : Set d = CreateObject("Scripting.Dictionary") 
d(1) = 2 
d(3) = 4 
Dim c : c = "cscript recdic.vbs " & qq(d2s(d)) 
WScript.Echo c 
Dim p : Set p = CreateObject("WScript.Shell").Exec(c) 
WScript.Echo p.Stdout.ReadAll() 

recdic。VBS:

Option Explicit 

Function s2d(s) 
    Set s2d = CreateObject("Scripting.Dictionary") 
    Dim a : a = Split(s) 
    Dim i 
    For i = 0 To UBound(a) Step 2 
     s2d.Add a(i), a(i + 1) 
    Next 
End Function 

Dim d : Set d = s2d(WScript.Arguments(0)) 
Dim k 
For Each k In d.Keys() 
    WScript.Echo k, "=>", d(k) 
Next 

代码复用:

cscript passdic2.vbs 
cscript recdic2.vbs 
1 => 2 
3 => 4 

passdic2.vbs

Option Explicit 

Function d2s(d) 
    ReDim a(d.Count - 1) 
    Dim i : i = 0 
    Dim k 
    For Each k In d.Keys() 
     a(i) = "cd.Add " & k & "," & d(k) 
     i = i + 1 
    Next 
    d2s = "Function cd():Set cd=CreateObject(""Scripting.Dictionary""):" & Join(a, ":") & ":End Function" 
End Function 

Dim d : Set d = CreateObject("Scripting.Dictionary") 
d(1) = 2 
d(3) = 4 
CreateObject("Scripting.FileSystemObject").CreateTextFile("thedic.inc").Write d2s(d) 
Dim c : c = "cscript recdic2.vbs" 
WScript.Echo c 
Dim p : Set p = CreateObject("WScript.Shell").Exec(c) 
WScript.Echo p.Stdout.ReadAll() 

thedic.inc

Function cd():Set cd=CreateObject("Scripting.Dictionary"):cd.Add 1,2:cd.Add 3,4:End Function 

recdic2.vbs

Option Explicit 

ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile("thedic.inc").ReadAll() 

Dim d : Set d = cd() 
Dim k 
For Each k In d.Keys() 
    WScript.Echo k, "=>", d(k) 
Next 
+0

那么如果有人知道OP想从一个VBS传递字典到另一个VBS,trhis看起来像是过度杀伤。相反,放弃“产卵独立过程”这个概念会带来一些可能性,例如正常参数传递给“被调用”的VBS中的函数。或者'ExecuteGlobal'调用,所以被调用的代码共享相同的全局范围。 'dicString'未定义可能是OP解决方案尝试的剩余部分,他的意思是'dic'。 – TheBlastOne

+0

@TheBlastOne - 那么,我应该从你的评论中学到什么?通过参数传递字典是不可能的,但是矫枉过正?ExecuteGlobal是一个脑袋,但比.Exec/.Run更好吗?关于OT意味着什么的推测(dicExp vs dic vs dicString)是徒劳的?) –

+0

没什么好学的。只是评论。没有违法意图。 – TheBlastOne