2017-04-24 80 views
0

在下面的示例中,我想編寫一個函數,該函數用$開頭的字符串替換該變量的實際內容。考慮到功能會分析所有mathing $somevar所以,不要把它的文學僅爲param1param2如何通過存儲在字符串中的名稱訪問變量?

Dim myCmd, param1, param2 

Const MY_CONST = "constValue"  

param1 = "myParameter1" 
param2 = "myParameter2" 

myCmd = "myprogram.exe $param1 $param2 $MY_CONST" 
myCmd = addParams(myCmd) 

Function addParams(cmdStr) 

' this function should replace all "$variables" by its respective content 
' Example: "myprogram.exe myParameter1 myParameter2 constValue" 


End Function 

回答

0

我找到了解決辦法。這相當於Javascript Template Literals。它配備撰寫與參數和情況下,有必要加入各種字符串和變量命令行的時候是非常有用的:基於Lankymart評論

Sub ev(ByRef cmdStr) 
    Dim rx, matches, match 

    ' Replace single quotes with double quotes 
    cmdStr = replace(cmdStr, "'", chr(34)) 

    ' Replace $variavle strings with their actual value 
    Set rx = New RegExp 
    rx.Global = True 
    rx.pattern = "\$\w+" 
    Set matches = rx.Execute(cmdStr) 
    For each match in matches 
     cmdStr = replace(cmdStr, match, eval(replace(match, "$", ""))) 
    Next 
End Sub 


Const HOST = "192.168.0.1" 
Dim cmd, param1, param2 

param1 = "-t" 
param2 = "-w 5000" 
cmd = "ping $param1 $param2 $HOST" 
ev cmd 

wscript.echo cmd 

更好的方法:

function bind(cmdStr, arrParams) 
    Dim i 
    For i = 0 to uBound(arrParams) 
     cmdStr = replace(cmdStr, "$"&i+1, arrParams(i)) 
    Next 
    cmdStr = replace(cmdStr, "'", chr(34)) 
    bind = cmdStr 
End Function 


cmd = bind("program.exe --param1 '$1' --param2 '$2'", Array(myVar1, myVar2)) 
+0

的一個問題,我有這種方法是利用全球範圍的變量,如果你要建立一個功能,這應該是自包含的。你能不能通過'Array()'傳遞參數?像'Call ev(cmd,Array(param1,param2))'這樣的''RegExp'將會是多餘的,結果是基於數組中傳遞的內容。 – Lankymart

+0

的確,這種方法中的變量必須是全球性的。使用更復雜的腳本時,您的建議會更好。 – Azevedo

0

不得不稍微去做這個自包含的,這裏是我的嘗試根據@Azevedo'sanswer

夫婦加法

  • 的參數通陣列,以便它們出現
  • 在陣列力去除相關聯的空間發送空白參數。
Function ev(cmd, params) 
    Dim rx, matches, i, result 
    result = cmd 
    Set rx = New RegExp 
    rx.Global = True 
    rx.pattern = "\$\w+" 
    Set matches = rx.Execute(cmd) 
    If matches.Count > 0 Then 
    For i = 0 To matches.Count - 1 
     If IsArray(params) Then 
     If Len(params(i)) > 0 Then params(i) = " " & params(i) 
     result = Replace(result, " " & matches(i), params(i)) 
     End If 
    Next 
    End If 
    ev = result 
End Function 

Const HOST = "192.168.0.1" 
Dim cmd: cmd = "ping $param1 $param2 $HOST" 

'Test with all parameters 
WScript.Echo ev(cmd, Array("-t", "-w 5000", HOST)) 
'Test with missing parameter 
WScript.Echo ev(cmd, Array("-t", "", HOST)) 
'Test with no parameters 
WScript.Echo ev(cmd, Empty) 

輸出:

ping -t -w 5000 192.168.0.1 
ping -t 192.168.0.1 
ping $param1 $param2 $HOST 
相關問題