2011-01-29 45 views
29

Tôi đã sử dụng đoạn mã sau đây để thực hiện lệnh schtasks từ VB6. Trong khi thực hiện nó, bỏ qua thư mục nếu chúng có chứa dấu cách. Ví dụ: "C:\program files\test\test.exe" sẽ được chuyển đổi thành "c:\program ". Làm cách nào để giải quyết vấn đề này?Thoát trích dẫn kép trong chuỗi 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 

nhiệm vụ mới được thêm vào như "c:\program" thay vì "C:\program files\test\test.exe"

Cảm ơn trước.

+0

Chỉ tò mò: Tại sao bạn sử dụng VB6? Ngôn ngữ đó không được thay thế ở mọi nơi ngay bây giờ? – Olhovsky

+4

@Kdoto: Đó là những gì Microsoft muốn bạn tin. Đầu tiên họ đầu tư rất nhiều vào việc làm sáng tỏ ngôn ngữ, sau đó rời khỏi cuộc nói chuyện với khối lượng chưa rửa. – wqw

+3

@kdoto @wqw Microsoft [cho biết vào ngày 09 tháng 9] (http://channel9.msdn.com/posts/funkyonex/What-is-Microsofts-Visual-Basic-6-Support-Strategy) vẫn còn vài triệu * * những người sử dụng VB6, vì vậy có lẽ nó không phải là đáng ngạc nhiên. Nhiều người có rất nhiều mã VB6 "di sản" và Microsoft không cung cấp một lộ trình nâng cấp phù hợp. – MarkJ

Trả lời

56

Dấu ngoặc thoát trong chuỗi VB6 hoặc VBScript đơn giản về lý thuyết mặc dù thường đáng sợ khi xem. Bạn thoát khỏi một dấu ngoặc kép với một dấu ngoặc kép khác.

Một ví dụ:

"c: \ Program Files \ ứng dụng của tôi \ app.exe"

Nếu tôi muốn thoát khỏi dấu ngoặc kép vì vậy tôi có thể chuyển thông tin này đến vỏ thực hiện chức năng được liệt kê bởi Joe hoặc hàm VB6 Shell tôi sẽ viết nó:

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

Cách thức hoạt động? Các dấu ngoặc kép đầu tiên và cuối cùng quấn chuỗi và cho VB biết đây là một chuỗi. Sau đó, mỗi trích dẫn được hiển thị theo nghĩa đen trong chuỗi có một dấu ngoặc kép khác được thêm vào trước nó để thoát khỏi nó.

Sẽ trở nên điên rồ hơn khi bạn đang cố chuyển một chuỗi có nhiều phần được trích dẫn. Hãy nhớ rằng, mọi báo giá bạn muốn vượt qua đều phải được thoát.

Nếu tôi muốn vượt qua hai cụm từ được trích dẫn như là một chuỗi đơn ngăn cách bởi một không gian (mà không phải là không phổ biến):

"c: \ Program Files \ ứng dụng của tôi \ app.exe" "c: \ Documents and Settings \ steve"

tôi sẽ nhập này:

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

tôi đã giúp quản trị hệ thống của tôi với một số VBScripts rằng đã có nhiều hơn dấu ngoặc kép.

Nó không đẹp, nhưng đó là cách nó hoạt động.

+1

Một lưu ý khác. Điều quan trọng là quấn các chuỗi mà bạn đang chuyển đến các hàm Shell và ShellExecute trong các dấu nháy kép khi đường dẫn của bạn chứa các khoảng trắng. Các hàm Windows Shell và ShellExecute hiểu không gian dưới dạng dấu phân cách mục hàng trừ khi các dấu cách được bao bọc trong dấu ngoặc kép. Vì vậy, nếu bạn chỉ cần vượt qua c: \ Program Files \ My App \ App.exe, nó sẽ cố gắng chạy chương trình "C: \ Program.exe" với các đối số dòng lệnh của "Files \ My" và "App \ App .exe " –

+0

Tôi không nghĩ rằng VB6 trả tiền cho bất kỳ sự chú ý đến dấu nháy đơn (" dấu nháy đơn ") nhưng bạn có thể nghĩ về một cái gì đó giống như cú pháp SQL trong một giá trị chuỗi VB6. – Bob77

+0

Bạn đúng là Bob. Lỗi của tôi. Tôi đã sửa câu trả lời. –

4

Bạn đã thử sử dụng dấu ngoặc kép chưa? Bất kể, không ai trong năm 2011 nên bị giới hạn bởi lệnh shell VB6 nguyên gốc. Đây là một hàm sử dụng ShellExecuteEx, linh hoạt hơn nhiều.

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

Một ví dụ khác:

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

Chúc may mắn!

+0

4 trích dẫn liên tiếp. Vì vậy, tổng ... –

+0

Đó là một ý tưởng hay – Maruf

Các vấn đề liên quan