web-dev-qa-db-ja.com

VB stringで二重引用符をエスケープする

VB6からschtasksコマンドを実行するには、次のコードを使用しました。実行中、フォルダーにスペースが含まれている場合、フォルダーは無視されます。たとえば、"C:\program files\test\test.exe""c:\program "に変換されます。この問題を解決するにはどうすればよいですか?

MyAppname =  Chr(34) & App.Path & "\" & App.EXEName & ".exe" & Chr(34)
StrCommand = "schtasks /create /sc ONLOGON /RL HIGHEST  /tn myapp  /tr " & MyAppname  
Shell StrCommand, vbHide   

新しいタスクが"c:\program"ではなく"C:\program files\test\test.exe"として追加されました

前もって感謝します。

39
Suriyan Suresh

VB6またはVBScriptの文字列で引用符をエスケープすることは理論的には簡単ですが、見たときに恐ろしいことがよくあります。別の二重引用符で二重引用符をエスケープします。

例:

「c:\ program files\my app\app.exe」

ジョーによってリストされたシェル実行関数またはVB6シェル関数にこれを渡すことができるように二重引用符をエスケープする場合は、次のように記述します。

escapedString = """c:\program files\my app\app.exe"""

これはどのように作動しますか?最初と最後の引用符は文字列をラップし、VBこれが文字列であることを知らせます。文字列に文字通り表示される各引用符には、エスケープするために二重引用符が追加されます。

引用符で囲まれた複数のセクションを含む文字列を渡そうとすると、さらにひどくなります。渡したい引用はすべてエスケープする必要があることを忘れないでください。

これら2つの引用句を、スペースで区切られた単一の文字列として渡す場合(これは珍しいことではありません):

「c:\ program files\my app\app.exe」「c:\ documents and settings\steve」

私はこれを入力します:

escapedQuoteHell = """c:\program files\my app\app.exe"" ""c:\documents and settings\steve"""

さらに引用符が付いているVBScriptを使用して、システム管理者を支援しました。

それはきれいではありませんが、それはそれがどのように機能するかです。

67
Steve Massing

もう一つの例:

Dim myPath As String = """" & Path.Combine(part1, part2) & """"

がんばろう!

6
Brian Sweeney

二重引用符を使用してみましたか?とにかく、2011年には、VB6シェルのネイティブコマンドによって制限されるべきではありません。はるかに汎用性の高いShellExecuteExを使用する関数を次に示します。

Option Explicit

Private Const SEE_MASK_DEFAULT = &H0

Public Enum EShellShowConstants
        essSW_HIDE = 0
        essSW_SHOWNORMAL = 1
        essSW_SHOWMINIMIZED = 2
        essSW_MAXIMIZE = 3
        essSW_SHOWMAXIMIZED = 3
        essSW_SHOWNOACTIVATE = 4
        essSW_SHOW = 5
        essSW_MINIMIZE = 6
        essSW_SHOWMINNOACTIVE = 7
        essSW_SHOWNA = 8
        essSW_RESTORE = 9
        essSW_SHOWDEFAULT = 10
End Enum

Private Type SHELLEXECUTEINFO
        cbSize        As Long
        fMask         As Long
        hwnd          As Long
        lpVerb        As String
        lpFile        As String
        lpParameters  As String
        lpDirectory   As String
        nShow         As Long
        hInstApp      As Long
        lpIDList      As Long     'Optional
        lpClass       As String   'Optional
        hkeyClass     As Long     'Optional
        dwHotKey      As Long     'Optional
        hIcon         As Long     'Optional
        hProcess      As Long     'Optional
End Type

Private Declare Function ShellExecuteEx Lib "Shell32.dll" Alias "ShellExecuteExA" (lpSEI As SHELLEXECUTEINFO) As Long

Public Function ExecuteProcess(ByVal FilePath As String, ByVal hWndOwner As Long, ShellShowType As EShellShowConstants, Optional EXEParameters As String = "", Optional LaunchElevated As Boolean = False) As Boolean
    Dim SEI As SHELLEXECUTEINFO

    On Error GoTo Err

    'Fill the SEI structure
    With SEI
        .cbSize = Len(SEI)                  ' Bytes of the structure
        .fMask = SEE_MASK_DEFAULT           ' Check MSDN for more info on Mask
        .lpFile = FilePath                  ' Program Path
        .nShow = ShellShowType              ' How the program will be displayed
        .lpDirectory = PathGetFolder(FilePath)
        .lpParameters = EXEParameters       ' Each parameter must be separated by space. If the lpFile member specifies a document file, lpParameters should be NULL.
        .hwnd = hWndOwner                   ' Owner window handle

        ' Determine launch type (would recommend checking for Vista or greater here also)
        If LaunchElevated = True Then ' And m_OpSys.IsVistaOrGreater = True
            .lpVerb = "runas"
        Else
            .lpVerb = "Open"
        End If
    End With

     ExecuteProcess = ShellExecuteEx(SEI)   ' Execute the program, return success or failure

    Exit Function
Err:
    ' TODO: Log Error
    ExecuteProcess = False
End Function

Private Function PathGetFolder(psPath As String) As String
    On Error Resume Next
    Dim lPos As Long
    lPos = InStrRev(psPath, "\")
    PathGetFolder = Left$(psPath, lPos - 1)
End Function
4
Joe Jordan