Vbscript vbs使用字典作为参数执行另一个vbs脚本

Vbscript vbs使用字典作为参数执行另一个vbs脚本,vbscript,Vbscript,我正在尝试从另一个vbscript执行vbscript。我的想法是,我必须传递一个字典作为参数,但我总是得到相同的错误消息。 以下是我目前的代码: dim objShell Set objShell = Wscript.CreateObject("WScript.Shell") dim dicExp Set dicExp = CreateObject("Scripting.Dictionary") dic.add 0, 10 objShell.Run "C:\Users\groeschm\De

我正在尝试从另一个vbscript执行vbscript。我的想法是,我必须传递一个字典作为参数,但我总是得到相同的错误消息。 以下是我目前的代码:

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-无效属性分配的参数数目错误

您好,
Michael

您无法将对象引用传递给
WScript.Shell.Run
。看,它说命令行参数是一个字符串,而不是别的

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

就这么简单

即使可以,这也没有用,因为被调用的VBS与调用方代码不共享相同的全局作用域

你应该考虑代码< >运行< /代码>的选项。您可以将

ODBCAktuell.vbs
代码放入函数中,并调用该函数。或者考虑<代码> Excel文件>代码>或相关内含关系之一。 (如果不知道
ODBCAktuell.vbs
包含什么内容,也不知道您正试图实现什么目标,就很难向您提供更进一步的建议。)

基于同一个脑虫,有一个类似的问题:

  • OT的代码搞乱了<代码>字符串未定义。它不会抛出声明的错误,而是抛出一个“objectrequired”,因为字典名为
    dicExp
    ,而不是
    dic
  • 虽然blastone正确地指出,除了通过命令行传递字符串,您不能传递任何内容,但希望传递其他(更复杂)类型的数据是合法的。从命令行参数生成数字或日期是标准过程。而且:想要通过某种导入/使用/包含机制重用代码不是一个脑病,而是良好编程所必需的
  • 序列化(通过字符串)的一般方法是,但在VBScript()中使用它并不容易
  • 简单案例(以数字/标量/简单字符串作为键和值的字典)的“滚动您自己的”方法的起点很简单:

    字符串化:

    cscript passdic.vbs
    cscript recdic.vbs "1 2 3 4"
    1 => 2
    3 => 4
    
    cscript passdic2.vbs
    cscript recdic2.vbs
    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 passdic.vbs
    cscript recdic.vbs "1 2 3 4"
    1 => 2
    3 => 4
    
    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公司

    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
    

    dicString
    来自哪里?这是什么?如果一个人知道OP想把一本字典从一个VBS传递到另一个VBS,那么这似乎是矫枉过正。相反,放弃“生成单独进程”的概念会带来一些可能性,比如正常参数传递给“被调用”VBS中的函数。或者
    ExecuteGlobal
    ”调用,因此被调用的代码共享相同的全局范围。
    dicString
    未定义可能是OP解决方案尝试的遗留问题,他的意思是
    dic
    @TheBlastOne-那么(我应该从你的评论中了解什么呢?通过参数传递字典是不可能的,但太过了?ExecuteGlobal是一个脑残,但比.Exec/.Run更好?关于OT的含义的猜测(dicExp vs dic vs dicString)是徒劳的吗?)