2011-01-29 5 views
29

Ho utilizzato la seguente parte di codice per eseguire il comando schtasks da VB6. Durante l'esecuzione, ignora la cartella se contengono spazi. Ad esempio, "C:\program files\test\test.exe" verrà convertito in "c:\program ". Come posso risolvere questo problema?Fuga doppia citazione nella stringa VB

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

nuovo compito aggiunto come "c:\program" invece di "C:\program files\test\test.exe"

Grazie in anticipo.

+0

Solo curioso: perché stai usando VB6? Ormai quella lingua non è stata sostituita dappertutto? – Olhovsky

+4

@Kdoto: questo è ciò che Microsoft vuole che tu creda. Prima hanno investito molto nella demonizzazione della lingua, poi hanno lasciato parlare alle masse non lavate. – wqw

+3

@kdoto @wqw Microsoft [detto in settembre 09] (http://channel9.msdn.com/posts/funkyonex/What-is-Microsofts-Visual-Basic-6-Support-Strategy) c'erano ancora diversi * milioni * persone che usano VB6, quindi forse non è così sorprendente. Molte persone hanno un sacco di codice VB6 "legacy" e Microsoft non ha fornito un percorso di aggiornamento decente. – MarkJ

risposta

56

Escaping di virgolette in stringhe VB6 o VBScript è semplice in teoria, anche se spesso fa paura quando visualizzato. Esci da una doppia citazione con un'altra doppia citazione.

Un esempio:

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

Se voglio sfuggire alle virgolette così ho potuto passare questo al guscio eseguire la funzione elencata da Joe o la funzione VB6 Shell vorrei scriverlo:

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

Come funziona? La prima e l'ultima citazione racchiudono la stringa e lasciano a VB sapere che questa è una stringa. Quindi ogni citazione che viene visualizzata letteralmente nella stringa ha un'altra doppia citazione aggiunta per evitarlo.

Diventa più folle quando si tenta di passare una stringa con più sezioni citate. Ricorda, ogni citazione che vuoi passare deve essere sfuggita.

Se voglio passare questi due frasi citate come una singola stringa separate da uno spazio (che non è raro):

"c: \ program files \ mio app \ app.exe" "c: \ Documents and Settings \ steve"

vorrei entrare in questo:

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

ho aiutato i miei amministratori di sistema con alcune VBScript che hanno avuto ancora più citazioni.

Non è bello, ma è così che funziona.

+1

Un'altra nota. È importante racchiudere le stringhe che si passano alle funzioni Shell e ShellExecute tra virgolette quando il percorso contiene spazi. Le funzioni Shell e ShellExecute di Windows comprendono gli spazi come delimitatore di elementi della riga di comando a meno che gli spazi non siano racchiusi tra virgolette. Quindi, se si passa semplicemente c: \ Programmi \ My App \ App.exe, tenterà di eseguire il programma "C: \ Program.exe" con gli argomenti della riga di comando "Files \ My" e "App \ App" .exe " –

+0

Non penso che VB6 presta attenzione agli apostrofi (" virgolette singole ") ma si potrebbe pensare a qualcosa come la sintassi SQL in un valore di stringa VB6. – Bob77

+0

Hai ragione, Bob. Errore mio. Ho corretto la risposta. –

4

Hai provato a usare virgolette doppie? Indipendentemente da ciò, nessuno nel 2011 dovrebbe essere limitato dal comando nativo della shell VB6. Ecco una funzione che utilizza ShellExecuteEx, molto più 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 
5

Un altro esempio:

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

Buona fortuna!

+0

4 virgolette di fila. So gross ... –

+0

È una buona idea – Maruf