Escape de comillas dobles en cadena VB

He usado la siguiente pieza de código para ejecutar el comando schtasks desde VB6. Mientras lo ejecuta, ignora la carpeta si contienen espacios. Por ejemplo, "C:\program files\test\test.exe" se convertirá a "c:\program " . ¿Cómo resuelvo este problema?

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

Nueva tarea agregada como "c:\program" lugar de "C:\program files\test\test.exe"

Gracias por adelantado.

Las citas de escape en VB6 o VBScript son simples en teoría, aunque a menudo son aterradoras cuando se las visualiza. Usted escapa de una comilla doble con otra comilla doble.

Un ejemplo:

“c: \ archivos de progtwig \ my app \ app.exe”

Si quiero escapar de las comillas dobles para poder pasar esto a la función de ejecución de shell listada por Joe o la función VB6 Shell, la escribiría:

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

¿Como funciona esto? La primera y la última cita envuelven la cadena y le permiten a VB saber que es una cadena. Luego, cada cita que se muestra literalmente en la cadena tiene otra comilla doble añadida al frente para escapar de ella.

Se vuelve más loco cuando intentas pasar una cadena con múltiples secciones citadas. Recuerde, cada cita que quiera pasar debe ser escapada.

Si quiero pasar estas dos frases citadas como una sola cadena separada por un espacio (que no es poco común):

“c: \ archivos de progtwig \ my app \ app.exe” “c: \ documents and settings \ steve”

Entraría en esto:

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

He ayudado a mis administradores de sistemas con algunos VBScripts que han tenido incluso más citas.

No es lindo, pero así es como funciona.

Otro ejemplo:

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

¡Buena suerte!

¿Intentó usar comillas dobles? De todos modos, nadie en 2011 debería estar limitado por el comando de shell nativo VB6. Aquí hay una función que usa ShellExecuteEx, mucho más versátil.

 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