Escape double quote in VB string

后端 未结 3 1051
说谎
说谎 2020-11-30 06:26

I have used following piece of code to execute schtasks command from VB6. While executing it, ignores folder if they contains spaces. For example, \"C:\

相关标签:
3条回答
  • 2020-11-30 06:55

    Did you try using double-quotes? Regardless, no one in 2011 should be limited by the native VB6 shell command. Here's a function that uses ShellExecuteEx, much more versatile.

    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
    
    0 讨论(0)
  • 2020-11-30 07:01

    Another example:

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

    Good luck!

    0 讨论(0)
  • 2020-11-30 07:12

    Escaping quotes in VB6 or VBScript strings is simple in theory although often frightening when viewed. You escape a double quote with another double quote.

    An example:

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

    If I want to escape the double quotes so I could pass this to the shell execute function listed by Joe or the VB6 Shell function I would write it:

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

    How does this work? The first and last quotes wrap the string and let VB know this is a string. Then each quote that is displayed literally in the string has another double quote added in front of it to escape it.

    It gets crazier when you are trying to pass a string with multiple quoted sections. Remember, every quote you want to pass has to be escaped.

    If I want to pass these two quoted phrases as a single string separated by a space (which is not uncommon):

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

    I would enter this:

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

    I've helped my sysadmins with some VBScripts that have had even more quotes.

    It's not pretty, but that's how it works.

    0 讨论(0)
提交回复
热议问题