powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А есть какой-нибудь универсальный способ работы с параметрами командной строки?
11 сообщений из 11, страница 1 из 1
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38960870
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я обычно делал так:

Код: vbnet
1.
proga.exe /param1=value1 /param2 /param3=value3



Дальше берется тупо Command()

Has(Param1) -проверяется наличие (/param1+пробел) либо (/param1=)
Value(Param1) -при наличии /param1= берем напр. до следующего (пробел+/), либо до конца строки и делаем Trim()

Могу конечно и в .Net этот принцип оставить.

Хочется например в таком виде получать:

Код: vbnet
1.
proga.exe -param1 value1 -param2 -param3 value3



Ну допустим делаю:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  Sub main(args As String())
     If args.Length <> 0 Then
      For i As Integer = 0 To args.Length - 1
        MsgBox(args(i))
       Next
    End If
  End Sub



Пример:
Код: vbnet
1.
CmdArgc.exe -del -u username -file "C:\Мой Путь\myfile.txt" -param1 -param2 value2



Ну, он мне выведет подряд:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
-del
-u
username
-file
C:\Мой Путь\myfile.txt
-param1
-param2
value2


Вполне ожидаемо.Разбил верно (пробелы, кавычки), только в кучу.

А нужна какая-нибудь конструкция, чтоб две функции четко отвечали на 2 актуальных вопроса:
Код: vbnet
1.
2.
HasParam(ByVal param as String) as Boolean 'для да/нет этого достаточно
GetParamValue(ByVal param as String) as String 'если отсутствует, то пустой строки достаточно, либо проверка на Has  


Можно по простому сделать?
Куда и как пары StringOption-Value считывать? Словарь, коллекция?

И до кучи вопрос. Есть способ в IDE студии командную строку задавать чтоб в Debug.Print смотреть чего получается
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38960903
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так думаю:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
Public Class cArgList

  Private DiArgs As New Dictionary(Of String, String)

  Public Sub New(ByVal args As String(), Optional ByVal keyprefix As String = "-")
    Dim key As String = ""
    If args.Length <> 0 Then
      For i As Integer = 0 To args.Length - 1
        If Strings.Left(args(i), Strings.Len(keyprefix)) = keyprefix Then
          key = Strings.Right(args(i), Strings.Len(args(i)) - Strings.Len(keyprefix))
          DiArgs.Add(key, vbNullString)
        Else
          If Strings.Len(key) > 0 AndAlso DiArgs.ContainsKey(key) Then
            DiArgs(key) = args(i)
            key = ""
          End If
        End If
      Next
    End If
  End Sub

  Public ReadOnly Property HasOption(ByVal key As String) As String
    Get
      Return DiArgs.ContainsKey(key)
    End Get
  End Property

  Public ReadOnly Property GetOptionString(ByVal key As String) As String
    Get
      Dim str_value As String = vbNullString
      If DiArgs.TryGetValue(key, str_value) Then
        Return str_value
      Else
        Return vbNullString
      End If
    End Get
  End Property

  Public ReadOnly Property Count() As Integer 'если командная строка пустая, то нуль
    Get
      Return DiArgs.Keys.Count
    End Get
  End Property

  Public ReadOnly Property Options() As Dictionary(Of String, String).KeyCollection
    Get
      Return DiArgs.Keys
    End Get
  End Property

End Class

Module Module1

  Public PArgList As cArgList

  Sub main(args As String())
    PArgList = New cArgList(args)

    'test
    Dim str As String = ""
    For Each k As String In PArgList.Options
      str = AddUsingDelimiter(k & "=" & PArgList.GetOptionString(k), str, vbCrLf)
    Next
    MsgBox(str)
    MsgBox(PArgList.HasOption("file"))
    MsgBox(PArgList.GetOptionString("file"))
    MsgBox(PArgList.HasOption("nooption"))
    MsgBox(PArgList.GetOptionString("nooption"))
  End Sub

  Public Function AddUsingDelimiter(ByVal str_to_add As String, ByVal str_base As String, ByVal Delimiter As String) As String
    'добавление компонента к сложному параметру через Delimiter (напр. ,-запятая)
    'str_to_add-то чего добавляем, str_base-вся строка
    If str_base = "" Then
      AddUsingDelimiter = str_to_add
    Else
      AddUsingDelimiter = str_base & Delimiter & str_to_add
    End If
  End Function

End Module
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38960907
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть подправил, чтоб не пытался добавить ключ второй раз и не добавлял пустые, вроде больше исключений и тупостей быть не должно.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  Public Sub New(ByVal args As String(), Optional ByVal keyprefix As String = "-")
    Dim key As String = ""
    If args.Length <> 0 Then
      For i As Integer = 0 To args.Length - 1
        If Strings.Left(args(i), Strings.Len(keyprefix)) = keyprefix Then
          key = Strings.Right(args(i), Strings.Len(args(i)) - Strings.Len(keyprefix))
          If Strings.Len(key) > 0 AndAlso DiArgs.ContainsKey(key) = False Then _
           DiArgs.Add(key, vbNullString)
        Else
          If Strings.Len(key) > 0 AndAlso DiArgs.ContainsKey(key) Then
            DiArgs(key) = args(i)
            key = ""
          End If
        End If
      Next
    End If
  End Sub
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38960908
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чем топик?
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38960914
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, ну чудес-то не бывает, одному БГ известно, какая у вас логика обработки параметров... Если хочется чего-то готового... то поищите... что нить типа Command Line Parser Library или еще чего...
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38960946
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

Да я уж понял что
Код: vbnet
1.
Sub main(args As String())


это максимум что можно выжать,

главное оно всякие кавычки правильно понимает.

моего класса думаю достаточно, смотрел совсем неиного на реализацию в ptlib (C++), если что допишу.
Свои утилиты обычно со своими exe и использую, при этом предпочитаю даже не Console а main() в "Win.Forms" без самой формы(аналог модуля в VB6). Так что о потенциальных частных глюках можно особо не заботиться.
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38961348
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAО чем топик?

"А есть какой-нибудь универсальный способ работы с параметрами командной строки? "
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38961355
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhskyANAО чем топик?

"А есть какой-нибудь универсальный способ работы с параметрами командной строки? "Параметры командной строки - это массив. Универсальный способ - loop.

Пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@echo off

if '%1' == '/?' goto usage
if '%1' == '-?' goto usage
if '%1' == '?' goto usage
if '%1' == '/help' goto usage
if '%1' == '--help' goto usage

:loop
if '%1' == '' goto begin

call Arguments.Parse.bat %1 %2

shift & goto loop
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38961381
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAУниверсальный способ - loop.


17652098
Код: vbnet
1.
2.
3.
For i As Integer = 0 To args.Length - 1
...
Next


Чем не Loop?

Да, у меня там ошибка (несущественная но тупая):

Код: vbnet
1.
2.
3.
4.
5.
Public ReadOnly Property HasOption(ByVal key As String) As Boolean
    Get
      Return DiArgs.ContainsKey(key)
    End Get
End Property



Решил pop3 клиента вынести в отдельный exe с параметрами типа
Код: vbnet
1.
-u user -pw password -useSSL -s server -port 995 -delete...


17647324
Да вроде все получается.

skyANAПример:[src C#]
if '%1' == '/?' goto usage
if '%1' == '-?' goto usage
if '%1' == '?' goto usage
if '%1' == '/help' goto usage
if '%1' == '--help' goto usage

А вот этого как раз не надо. Это для "внутреннего пользования", вызывающая прога знает.
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38979146
Poke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторА нужна какая-нибудь конструкция, чтоб две функции четко отвечали на 2 актуальных вопроса:
HasParam(ByVal param as String) as Boolean 'для да/нет этого достаточно
GetParamValue(ByVal param as String) as String 'если отсутствует, то пустой строки достаточно, либо проверка на Has


Такую либу дольше писать, чем самому тупо разобрать параметры, т.к. у всех свои задачи. Вот прекрасный пример в пику:

Код: plaintext
findIndex.exe -range 1 10 -value 7

Тут если делать универсальный всемогутер, надо конфигурировать каждый параметр - сколько значений, как указываются (мож, через запятую!), какие типы поддерживаются... для того, кто это использует , гемор обеспечен.

Я делал проще: загонял все параметры в стек и доставал по одному. Если "оно" начинается со слэша/минуса - обрабатываем имя параметра (и в обработчике мы чётко знаем, сколько/каких значений параметра должно следовать). Результат загоняем в глобальные сеттинги и юзаем изо всех мест.
...
Рейтинг: 0 / 0
А есть какой-нибудь универсальный способ работы с параметрами командной строки?
    #38979434
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pokeзагонял все параметры в стек
а это ещё занахера?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А есть какой-нибудь универсальный способ работы с параметрами командной строки?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]