使用参数从vbscript到批处理文件传递变量

时间:2013-04-01 22:45:56

标签: vbscript batch-file

请问如何将这个vbs中的'inp'变量传递给名为job.bat的批处理?实际上,当从job.bat进行回显(echo%2)时,我注意到inp没有正确传递。命令视图inp而不是从vbs检索的值。谢谢

For Each listElement In xmlDoc.selectNodes("document/Lists/list")
 msgbox "toto"
 inp=listElement.selectSingleNode("entry").text
 out=  listElement.selectSingleNode("output").text
 jeton=  listElement.selectSingleNode("token").text

 dim shell
 set shell=createobject("wscript.shell") 
 shell.run "job.bat ""a file"" **inp** "
 set shell=nothing 
 Next 

2 个答案:

答案 0 :(得分:2)

我认为你要找的是这个。

shell.run "job.bat ""argfile.ext"" " & inp

然而,正如Ansgar Wiechers指出的那样,这是一个潜在的严重安全漏洞,因为一个危险的XML文件可以运行任意命令。要封装批处理文件参数并防止意外后果,请考虑切换到Shell.Application对象的ShellExecute method

For Each listElement In xmlDoc.selectNodes("document/Lists/list")

    msgbox "toto"
    inp = listElement.selectSingleNode("entry").text
    out = listElement.selectSingleNode("output").text
    jeton = listElement.selectSingleNode("token").text

    set shell=CreateObject("Shell.Application") 
    shell.ShellExecute "job.bat", """a file"" " & inp, "path\to\batfile\", "runas", 1
    set shell=nothing 

Next 

答案 1 :(得分:2)

与其他几种语言不同,VBScript不会在字符串中扩展变量。因此,字符串中的inp

"job.bat ""a file"" inp "

只是文字字符串"inp",而不是变量inp的值。要生成具有变量值的字符串,您必须连接基本字符串和变量,如@rojo建议:

shell.run "job.bat ""a file"" " & inp
但是,如果没有一些安全预防措施,我不建议这样做。首先,你应该在你的参数周围加上双引号,以防它们包含空格。我通常使用引号函数来防止指令被四引号括起来:

Function qq(str) : qq = Chr(34) & str & Chr(34) : End Function

'...
shell.run "job.bat " & qq("a file") & " " & qq(inp)

您还应该始终对所有传递给shell命令的用户输入应用清理。否则,您的用户可能会输入类似foo & del /s /q C:\*.*的内容而造成严重破坏。通常的做法是只允许输入字符串中的已知良好字符,并用安全字符(例如下划线)替换其他所有字符。您可以使用正则表达式实现此目的:

Set re = New RegExp
re.Pattern = "[^ a-z0-9äöü.,_$%()-]"
re.Global  = True
re.IgnoreCase = True

inp = re.Replace(inp, "_")