Простой парсер аргументов командной строки - VB
Формулировка задачи:
Рылся в интернете - не нашел. Хотелось, конечно, RegExp.
Написал сам. В боевіх условиях вместо переменной St подставляем Command
Это все нужно, если аргументами командной строки могут попадаться пути с пробелами (как и положено, заключенные кавычками).
Может у кого еще есть похожие примеры.
Листинг программы
- Sub Parse_CMD_Line()
- Dim Lex, St$, nL&, nA&, Unit$
- St = "c:\123\test.exe 123 ""456"" ""789 0123"" aaa BBB """"" 'Строка для разбора (пример)
- Debug.Print St
- If Len(St) = 0 Then Exit Sub
- Lex = Split(St) 'Разбиваем по пробелам для лексического анализа
- ReDim argv(0 To UBound(Lex)) 'Определяем выходной массив до максимально возможного числа параметров
- Do While nL <= UBound(Lex)
- Unit = Lex(nL) 'Записысаем смысловую единицу
- If Len(Unit) = 0 Then GoTo nxt 'Защита от двойных пробелов между параметрами
- If Left$(Lex(nL), 1) = """" Then 'Если попалась кавычка
- Do Until Right$(Lex(nL), 1) = """" 'Пока не найдем кавычке пару
- nL = nL + 1
- If nL > UBound(Lex) Then Exit Do 'Если не дождались завершающей кавычки, а лимит превышен
- Unit = Unit & " " & Lex(nL)
- Loop
- Unit = Replace$(Unit, """", "") 'Удаляем кавычки
- End If
- argv(nA) = Unit
- nA = nA + 1 'Счетчик выходных аргументов
- nxt:
- nL = nL + 1 'Счетчик лексических единиц
- Loop
- ReDim Preserve argv(0 To nA - 1)
- Stop 'Смотрим Locals
- End Sub
Решение задачи: «Простой парсер аргументов командной строки»
textual
Листинг программы
- Option Explicit
- Private Declare Function GetCommandLineAPI Lib "kernel32" Alias "GetCommandLineW" () As Long
- Private Declare Function CommandLineToArgvW Lib "shell32" (ByVal lpCmdLine As Long, pNumArgs As Long) As Long
- Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
- Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal Size As Long)
- Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
- Private Function PtrToString(ptr As Long) As String
- Dim buffer() As Byte
- Dim lengthString As Long
- If CBool(ptr) Then
- lengthString = lstrlenW(ptr) * 2
- If CBool(lengthString) Then
- ReDim buffer(lengthString - 1)
- CopyMemory buffer(0), ByVal ptr, lengthString
- PtrToString = buffer
- End If
- End If
- End Function
- Private Function PtrToDWORD(ByVal ptr As Long) As Long
- Dim lngValue As Long
- If CBool(ptr) Then
- CopyMemory lngValue, ByVal ptr, 4&
- PtrToDWORD = lngValue
- End If
- End Function
- Public Function GetCommandLineArgs() As String()
- Dim cmdLinePtr As Long
- Dim numArgs As Long
- Dim argPtr As Long
- Dim i As Integer
- Dim strArgs() As String
- Dim GetCommand As String
- GetCommand = "2222 4444 66666 67fffd" ' фейковая CommandLine
- cmdLinePtr = CommandLineToArgvW(StrPtr(GetCommand), numArgs) ' фейковая CommandLine
- ' cmdLinePtr = CommandLineToArgvW(GetCommandLineAPI(), numArgs) ' Настоящая CommandLine
- Debug.Print numArgs ' кол-во аргументов
- If CBool(cmdLinePtr) Then
- ReDim strArgs(numArgs - 1)
- For i = 0 To numArgs - 1
- argPtr = PtrToDWORD(cmdLinePtr + (i * 4))
- strArgs(i) = PtrToString(argPtr)
- Debug.Print strArgs(i) ' Набор команд
- Next
- Call LocalFree(cmdLinePtr)
- GetCommandLineArgs = strArgs ' возвращаем массив команд
- End If
- End Function
- Private Sub Form_Load()
- GetCommandLineArgs
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д