Подтвердить что ты не робот

Скрыть двойную кавычку в строке VB

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

Спасибо заранее.

4b9b3361

Ответ 1

Кавычки с экранированием в строках VB6 или VBScript просты в теории, хотя часто страшно при просмотре. Вы избегаете двойной цитаты с другой двойной цитатой.

Пример:

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

Если я хочу избежать двойных кавычек, поэтому я мог бы передать это функции выполнения оболочки, указанной в Joe или в функции VB6 Shell, я бы записал ее:

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

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

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

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

"c:\program files\my app\app.exe" "c:\документы и настройки \steve"

Я бы ввел это:

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

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

Это не очень, но, как это работает.

Ответ 2

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

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

Удачи!

Ответ 3

Вы пытались использовать двойные кавычки? Несмотря ни на что, никто в 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