开发者

Double quotes in VBScript argument

As I read and experienced for myself VBScript removes all double quotes from and argument. Does anyone know a way a开发者_如何学Goround this? How to pass double quotes into the script?


If that parameter requires quotes you could use a named parameter to identify it and then enclose the value with the double quotes

dim arg
if WScript.Arguments.Named.Exists("a") then
    arg = WScript.Arguments.Named("a")
    arg = chr(34) & arg & chr(34)
end if

and used thus:

cscript test.vbs /a:"a parameter"

but this doesn't help if you merely want to keep quotes if supplied. Single quotes are accepted though, so you could alternatively use single quotes (or another character/string) and do a Replace(arg, "'", chr(34)) to convert to double-quotes.


This script will get the command line as it is, with double quotes and everything to a variable called strLine, and display it:

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)

So running that with:

cscript scriptname.vbs "option" ""other option"" third option

would result in:

"option" ""other option"" third option


Rather than check for a command line to include WScript.ScriptName, you can get the current PID like in https://stackoverflow.com/a/13212628/1752986


Edit: Misunderstood the question so new answer here:

I don't think you can do that in any way. However, a work around might be to use the CommandLine property of the Win32_Process class, which should get you the complete commandline I think.

For example try this script:

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

With the parameters as: "some long commandline enclosed in double quotes here"


I am not sure if this works, but while passing parameter I guess you can do something like -

chr(34) + <your argument string> + chr(34)

The chr(34) stands for double quotes.


Unfortunately, I do not know any escape methods to pass double-quotes because its an argument delimiter. All I can suggest is to modify your script, or add the quotes from there.


Here's answer that draws upon/combines some of the others here and queries the process info based on the script's 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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜