2017-04-24 23 views
0

Im folgenden Beispiel möchte ich eine Funktion schreiben, die beginnend mit $ die Strings durch den tatsächlichen Inhalt dieser Variablen ersetzt. Berücksichtigen Sie dabei wird die Funktion analysieren alle mathing $somevar so, nehmen Sie sie nicht literarisch wird nur param1 und param2Wie kann man auf eine Variable in einem String zugreifen?

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 

Antwort

0

ich die Lösung gefunden. Dies entspricht Javascript Template Literals. Es kommt sehr nützlich zu sein, wenn Befehlszeilen mit Argumenten und Fälle zu komponieren, wo es notwendig ist, verschiedene Strings und Variablen zu verbinden:

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 

Ein besserer Ansatz basiert auf Lankymart Kommentar:

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

Das einzige Problem, das ich mit diesem Ansatz haben, ist die Verwendung von global Variablen scoped, wenn Sie eine Funktion für diese bauen gehen sollte es in sich geschlossen sein. Könnten Sie die Parameter nicht als 'Array()' übergeben? Etwas wie 'Call ev (cmd, Array (param1, param2))', auf diese Weise wäre die 'RegExp' redundant und das Ergebnis basiert auf dem, was im Array übergeben wird. – Lankymart

+0

In der Tat müssen Variablen in diesem Ansatz global sein. Ihr Vorschlag ist besser, wenn Sie mit komplexeren Skripten arbeiten. – Azevedo

0

gehabt haben ein wenig gehen, um dies in sich abgeschlossen, hier ist mein Versuch basierend auf @Azevedo'sanswer.

Paar von Additionen

  • Pass Array von Parametern, um sie erscheinen
  • blank Parameter Senden in der Array Kräfte Entfernung des zugeordneten Raum.
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) 

Ausgang:

ping -t -w 5000 192.168.0.1 
ping -t 192.168.0.1 
ping $param1 $param2 $HOST 
Verwandte Themen