2017-04-24 81 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 
相关问题