Escape двойная кавычка в строке VB - PullRequest
38 голосов
/ 29 января 2011

Я использовал следующий фрагмент кода для выполнения команды schtasks из VB6. При его выполнении папка игнорируется, если в ней есть пробелы. Например, "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"

Заранее спасибо.

Ответы [ 3 ]

65 голосов
/ 30 января 2011

Выход из кавычек в строках VB6 или VBScript прост в теории, но часто пугающий при просмотре.Вы избегаете двойной кавычки с другой двойной кавычкой.

Пример:

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

Если я хочу экранировать двойные кавычки, чтобы передать этоФункция выполнения оболочки, перечисленная Джо или функцией оболочки VB6 Я бы написал:

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

Как это работает?Первые и последние кавычки переносят строку и позволяют VB знать, что это строка.Затем к каждой кавычке, отображаемой буквально в строке, добавляется еще одна двойная кавычка, чтобы избежать ее.

Она становится безумной, когда вы пытаетесь передать строку с несколькими разделами в кавычках.Помните, что каждая цитата, которую вы хотите передать, должна быть экранирована.

Если я хочу передать эти две фразы в кавычках в виде одной строки, разделенной пробелом (что не редкость):

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

Я помог моим системным администраторамнекоторые VBScripts, у которых было еще больше кавычек.

Это не красиво, но вот как это работает.

6 голосов
/ 25 марта 2011

Другой пример:

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

Удачи!

4 голосов
/ 29 января 2011

Вы пробовали использовать двойные кавычки?В любом случае, в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...