2014-03-26 20 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