2017-04-24 16 views
0

以下の例では、始まる文字列を$で置き換える関数を、その変数の実際の内容で書きたいと考えています。私は解決策を見つけただけ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

という文学的にそれを取ることはありません、関数がすべてのように$somevarをmathingを解析します考慮してください。これは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

私はこのアプローチを持っている一つの問題は、グローバルの使用では、変数のスコープ。 paramsを '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 
    
  • 関連する問題