web-dev-qa-db-ja.com

VBScript引数の二重引用符

私が自分で読んで経験したように、VBScriptは引数からすべての二重引用符を削除します。誰かがこれを回避する方法を知っていますか?スクリプトに二重引用符を渡す方法は?

17
Dani

そのパラメーターが必須引用符である場合は、名前付きパラメーターを使用してパラメーターを識別し、値を二重引用符で囲むことができます。

_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"
_

しかし、提供された場合に引用符を保持したいだけの場合、これは役に立ちません。ただし、一重引用符areは受け入れられるため、代わりに一重引用符(または別の文字/文字列)を使用し、Replace(arg, "'", chr(34))を実行して二重引用符に変換することもできます。

11
user69820

このスクリプトは、コマンドラインをそのまま取得し、二重引用符とすべてを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
7
Kolatatti

WScript.ScriptNameを含むコマンドラインをチェックするのではなく、 https://stackoverflow.com/a/13212628/1752986 のように現在のPIDを取得できます。

2
Toughy

これが機能するかどうかはわかりませんが、パラメーターを渡すときに、次のようなことができると思います-

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

Chr(34)は二重引用符を表します。

1
Sachin Shanbhag

編集:質問を誤解したので、ここで新しい答え:

私はあなたがそれを決してすることができないと思います。ただし、回避策として、 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"

1
Hans Olsson

ここで他のいくつかを利用/組み合わせ、スクリプトの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
BuvinJ

残念ながら、引数の区切り文字であるため、二重引用符を渡すエスケープ方法はわかりません。私が提案できるのは、スクリプトを変更するか、そこから引用符を追加することだけです。

0
Ruel