0

请问如何将这个 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 
4

2 回答 2

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, "_")
于 2013-04-02T08:13:14.413 回答
2

我想你要找的是这个。

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

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

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 
于 2013-04-02T01:38:55.787 回答