私が自分で読んで経験したように、VBScriptは引数からすべての二重引用符を削除します。誰かがこれを回避する方法を知っていますか?スクリプトに二重引用符を渡す方法は?
そのパラメーターが必須引用符である場合は、名前付きパラメーターを使用してパラメーターを識別し、値を二重引用符で囲むことができます。
_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))
を実行して二重引用符に変換することもできます。
このスクリプトは、コマンドラインをそのまま取得し、二重引用符とすべてを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
WScript.ScriptNameを含むコマンドラインをチェックするのではなく、 https://stackoverflow.com/a/13212628/1752986 のように現在のPIDを取得できます。
これが機能するかどうかはわかりませんが、パラメーターを渡すときに、次のようなことができると思います-
chr(34) + <your argument string> + chr(34)
Chr(34)は二重引用符を表します。
編集:質問を誤解したので、ここで新しい答え:
私はあなたがそれを決してすることができないと思います。ただし、回避策として、 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"
ここで他のいくつかを利用/組み合わせ、スクリプトの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
残念ながら、引数の区切り文字であるため、二重引用符を渡すエスケープ方法はわかりません。私が提案できるのは、スクリプトを変更するか、そこから引用符を追加することだけです。