2013-04-01 175 views
0

請問如何將這個vbs中的'inp'變量傳遞給我的批處理命名爲job.bat?實際上,在執行echo(echo%2)時, job.bat,我注意到,INP不能正常通過。prompt命令INP意見,而不是從VBS檢索到的值。感謝從參數中傳遞變量從vbscript到批處理文件

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

我想你要找的東西是什麼。

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

但是,如Ansgar Wiechers指出的那樣,t他是一個潛在的嚴重安全漏洞,因爲一個背道而馳的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 
+0

謝謝。它解決了! – tamo

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, "_") 
+0

+1徹底。不過,我很好奇。你知道一個'ADODB.Command'對象,你可以做參數化查詢 - 'cmdObj.commandText =「INSERT INTO table(col1,col2)VALUES(?,?)」'然後是'cmdObj.parameters(0).value =「val1」'和'cmdObj.parameters(1).value =「val2」'來防止SQL注入攻擊。構建參數化查詢的相同約定是否可以用於其他事情,例如構建'shell.run'命令? – rojo

+0

不是我所知道的。你需要某種逃避函數來「化解」可能有害的字符,但我不知道任何內置在VBScript中的函數/方法(或通常的COM對象)。 –

+1

實際上,我只是運行了一個測試,看起來'Shell.Application'對象的[ShellExecute方法](http://ss64.com/vb/shellexecute.html)成功地封裝了參數以防止發生這種攻擊,重新描述。可能比'wsh.shell'的'run'方法更安全。 – rojo

相關問題