VBS以dictionary为参数,执行另一个VBS脚本



我正试图从另一个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文件

为一个类创建实例(驻留在B.vbs中)
  1. OT的代码乱了。dicString未定义。它不会抛出所声明的错误,而是抛出"Object Required",因为字典被命名为dicExp,而不是dic
  2. 虽然TheBlastOne声明你不能通过命令行传递除了字符串之外的任何东西是正确的,但希望传达其他(更复杂)类型的数据是合法的。从命令行参数生成数字或日期是标准过程。并且:想要通过某种导入/使用/包含机制来重用代码并不是一个大脑错误,但对于好的编程来说却是必不可少的。
  3. 序列化(通过字符串)的一般方法是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

最新更新