Vbscript vbs使用字典作为参数执行另一个vbs脚本
我正在尝试从另一个vbscript执行vbscript。我的想法是,我必须传递一个字典作为参数,但我总是得到相同的错误消息。 以下是我目前的代码: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
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
包含什么内容,也不知道您正试图实现什么目标,就很难向您提供更进一步的建议。)
基于同一个脑虫,有一个类似的问题:
dicExp
,而不是dic
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)是徒劳的吗?)