当我为自己阅读和体验时,VBScript会删除所有双引号和参数。有没有人知道这方面的方法?如何将双引号传递给脚本?
答案 0 :(得分:11)
如果该参数需要引号,您可以使用命名参数来识别它,然后用双引号括起该值
dim arg
if WScript.Arguments.Named.Exists("a") then
arg = WScript.Arguments.Named("a")
arg = chr(34) & arg & chr(34)
end if
并因此使用:
cscript test.vbs /a:"a parameter"
但如果您只想提供引号,这无济于事。单引号是,但您也可以使用单引号(或其他字符/字符串)并执行Replace(arg, "'", chr(34))
转换为双引号。
答案 1 :(得分:7)
这个脚本将按原样获取命令行,使用双引号和一个名为strLine的变量,并显示它:
Set objSWbemServices = GetObject("WinMgmts:Root\Cimv2")
Set colProcess = objSWbemServices.ExecQuery("Select * From Win32_Process")
For Each objProcess In colProcess
If InStr (objProcess.CommandLine, WScript.ScriptName) <> 0 Then
strLine = Mid(objProcess.CommandLine, InStr(objProcess.CommandLine , WScript.ScriptName) + Len(WScript.ScriptName) + 1)
End If
Next
WScript.Echo(strLine)
通过以下方式运行:
cscript scriptname.vbs "option" ""other option"" third option
会导致:
"option" ""other option"" third option
答案 2 :(得分:2)
答案 3 :(得分:1)
编辑:在这里误解了这个问题的新答案:
我认为你不能以任何方式做到这一点。但是,解决方法可能是使用Win32_Process类的CommandLine
属性,这应该可以为您提供完整的命令行。
例如,尝试这个脚本:
Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set processes = wmi.ExecQuery("SELECT * FROM Win32_Process")
For Each proc in processes
If InStr(proc.CommandLine, "double quotes") > 0 Then
wscript.echo proc.CommandLine
End IF
Next
参数为:"some long commandline enclosed in double quotes here"
答案 4 :(得分:1)
我不确定这是否有效,但在传递参数时我猜你可以做类似的事情 -
chr(34) + <your argument string> + chr(34)
chr(34)代表双引号。
答案 5 :(得分:0)
不幸的是,我不知道任何传递双引号的转义方法,因为它是一个参数分隔符。我可以建议的是修改你的脚本,或者从那里添加引号。
答案 6 :(得分:0)
这里的答案借鉴/结合了其他一些人,并根据脚本的pid查询流程信息:
Function ArgumentsString()
Dim nPid : nPid = ThisProcessId()
For Each oPrc In GetObject("winmgmts:\\.\root\cimv2").ExecQuery(_
"Select * From Win32_Process Where ProcessId=" & nPid )
Exit For : Next
ArgumentsString = Mid( oPrc.CommandLine, _
InStr(oPrc.CommandLine, WScript.ScriptName) + _
Len(WScript.ScriptName) + 1 )
End Function
Function ThisProcessId()
ThisProcessId = 0
Dim sTFile, oPrc
With CreateObject("Scripting.FileSystemObject")
sTFile = .BuildPath(.GetSpecialFolder(2), "sleep.vbs")
With .OpenTextFile(sTFile, 2, True)
.Write "WScript.Sleep 1000"
End With
End With
With CreateObject("WScript.Shell").Exec("WScript " & sTFile)
For Each oPrc In GetObject("winmgmts:\\.\root\cimv2").ExecQuery(_
"Select * From Win32_Process Where ProcessId=" & .ProcessID)
Exit For : Next
ThisProcessId = oPrc.ParentProcessId
End With
End Function