2011-01-29 60 views
29

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

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 añade como "c:\program" en lugar de "C:\program files\test\test.exe"

Gracias de antemano.

+0

Simplemente curioso: ¿Por qué estás usando VB6? ¿No ha sido reemplazado ese idioma en todas partes por ahora? – Olhovsky

+4

@Kdoto: Eso es lo que Microsoft quiere que creas. Primero invirtieron fuertemente en demonizar el lenguaje, luego dejaron de hablar a las masas sucias. – wqw

+3

@kdoto @wqw Microsoft [dijo en septiembre de 2009] (http://channel9.msdn.com/posts/funkyonex/What-is-Microsofts-Visual-Basic-6-Support-Strategy) todavía había varios * millones * personas que usan VB6, así que tal vez no sea tan sorprendente. Muchas personas tienen muchos códigos VB6 "heredados" y Microsoft no proporcionó una ruta de actualización decente. – MarkJ

Respuesta

56

cotizaciones que se escapan en VB6 o cadenas de VBScript es simple en teoría aunque a menudo aterradora cuando se ve. Usted escapa de una comilla doble con otra comilla doble.

Un ejemplo:

"c: \ Archivos de programa \ mi aplicación \ app.exe"

Si quiero escapar de las comillas dobles por lo que podía pasar esto a la cáscara de ejecutar la función que aparece por Joe o la función VB6 Shell lo escribiría:

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

¿Cómo 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 varias 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 programa \ mi aplicación \ app.exe" "c: \ Documents and Settings \ Steve"

que 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 bonito, pero así es como funciona.

+1

Otra nota. Es importante ajustar las cadenas que está pasando a las funciones Shell y ShellExecute entre comillas cuando su ruta contiene espacios. Las funciones de Windows Shell y ShellExecute entienden los espacios como un delimitador de línea de pedido a menos que los espacios estén entre comillas dobles. Por lo tanto, si simplemente pasa c: \ Program Files \ My App \ App.exe, intentará ejecutar el programa "C: \ Program.exe" con los argumentos de línea de comando de "Files \ My" y "App \ App". .exe " –

+0

No creo que VB6 preste atención a los apóstrofes (" comillas simples "), pero es posible que esté pensando en algo así como la sintaxis SQL en un valor de cadena VB6. – Bob77

+0

Tienes razón Bob. Mi error. He corregido la respuesta. –

4

¿Intentaste utilizar 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 
5

Otro ejemplo:

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

Buena suerte!

+0

4 citas seguidas. Tan grosero ... –

+0

Es una buena idea – Maruf

Cuestiones relacionadas