我正试图从另一个vbscript执行vbscript。我的想法是,我必须传递一个字典作为参数,但我总是得到相同的错误信息。下面是我到目前为止的代码:
dim objShell
Set objShell = Wscript.CreateObject("WScript.Shell")
dim dicExp
Set dicExp = CreateObject("Scripting.Dictionary")
dic.add 0, 10
objShell.Run "C:UsersgroeschmDesktopODBCAktuell.vbs " & dicString
但是我总是得到这个错误信息:错误800A01C2 -无效属性分配的参数数量错误。
问候,迈克尔。
不能传递对象引用给WScript.Shell.Run
。参见http://msdn.microsoft.com/en-us/library/d5fk67ky(v=vs.84).aspx,它说命令行参数是一个字符串,没有别的了。
不能传递Scripting.Dictionary
引用,也不能将该引用编码到string参数中。
就是这么简单!
即使你可以,这将是无用的,因为被调用的VBS不与调用代码共享相同的全局作用域。
你应该考虑Run
的替代品。您可以将ODBCAktuell.vbs
代码放入函数中,然后调用它。或者考虑ExecuteFile
或相关的内在特性之一。
(不知道ODBCAktuell.vbs
包含什么,也不知道你到底想要完成什么,很难给你更多的建议。)
有一个类似的问题基于相同的脑bug:从另一个。vbs文件
- OT的代码乱了。
dicString
未定义。它不会抛出所声明的错误,而是抛出"Object Required",因为字典被命名为dicExp
,而不是dic
。 - 虽然TheBlastOne声明你不能通过命令行传递除了字符串之外的任何东西是正确的,但希望传达其他(更复杂)类型的数据是合法的。从命令行参数生成数字或日期是标准过程。并且:想要通过某种导入/使用/包含机制来重用代码并不是一个大脑错误,但对于好的编程来说却是必不可少的。
- 序列化(通过字符串)的一般方法是JSON,但在VBScript中使用它并不容易。
对于简单的情况(以数字/标量/简单字符串作为键和值的字典),"roll your own"方法的起点是微不足道的:
函数把:
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