如何通过存储在字符串中的名称访问变量?
问题描述:
在下面的示例中,我想编写一个函数,该函数用$
开头的字符串替换该变量的实际内容。考虑到功能会分析所有mathing $somevar
所以,不要把它的文学仅为param1
和param2
如何通过存储在字符串中的名称访问变量?
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
答
我找到了解决办法。这相当于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))
答
不得不稍微去做这个自包含的,这里是我的尝试根据@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
的一个问题,我有这种方法是利用全球范围的变量,如果你要建立一个功能,这应该是自包含的。你能不能通过'Array()'传递参数?像'Call ev(cmd,Array(param1,param2))'这样的''RegExp'将会是多余的,结果是基于数组中传递的内容。 – Lankymart
的确,这种方法中的变量必须是全球性的。使用更复杂的脚本时,您的建议会更好。 – Azevedo