Dinesh Kumar Dora Ответов: 2

C# как передать различное количество аргументов командной строки консольному приложению


Здравствуйте друзья,

Мне интересно, можем ли мы передать различное количество аргументов командной строки консольному приложению.

например:
test.exe
test.exe аргумент1
test.exe арг1 арг2
test.exe аргумент1 аргумент2 значение arg3

все вышеперечисленные 4 вызова cmdprompt должны работать.
Возможно ли это?

я попробовал опцию params, как показано ниже, но она не удалась с помощью Array out of bound error.
Мы можем достичь этого любым другим способом?
Перегрузка функций также работает, но я не предпочитаю этого, так как не хочу копировать одну и ту же логику снова и снова для разного количества аргументов.

Что я уже пробовал:

<pre lang="c#">
static void Main(params string[] args)
        {
            try
            {
                int iResult = 0;
                if (args.Length == 0)
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new MainForm());
                }
                else
                {
                    for (int i = 0; i < args.Length; i++)
                    {
                        mainObject.lstArguements.Add(args[i]);
                    }

                    string argHTTPS = args[0];
                    string argCustDBName = args[1];
            }
            catch (Exception ex)
            {
                MessageBox.Show("FATAL ERROR: " + ex.Message);
            }
        }


Его неудача где - то в этом утверждении
строка argCustDBName = args[1];

когда я передаю только 1 аргумент. когда я передаю 2 аргумента, это работает. Можем ли мы как-то преодолеть это, чтобы поддержать динамическое число аргументов?

я хочу, чтобы когда пользователь передает только 1 arg, то он должен сохранить в [0] и [1] должен быть пустым или нулевым.
А когда пользователь передает только 2 arg, то он должен сохранять как в [0], так и в [1]
и если пользователь передает 3 arg то он должен сохранить в [0], [1], [2].

Пожалуйста помочь

2 Ответов

Рейтинг:
19

Richard MacCutchan

string argHTTPS = args[0];
string argCustDBName = args[1];

Это будет работать только в том случае, если у вас есть два или более параметров. Если вы хотите, чтобы он был динамическим, то вам нужно проверить, сколько параметров передается. Начните с установки значений по умолчанию для всех необязательных параметров, а затем замените все, что указано в командной строке.


Рейтинг:
0

Dave Kreskowiak

Ваш код не имеет никакого смысла. Если пользователь не передает никаких аргументов, он запускает приложение Windows Forms.

Если пользователь действительно передает Аргументы, вы добавляете каждый аргумент в то, что кажется списком (я понятия не имею, потому что вы никогда не показываете определение mainObject!), назначаете первые два аргумента двум различным переменным, даже если указан только 1 аргумент (!), а затем выбрасываете все это и ничего не делаете ни с одним из них.

О, и в вашем коде отсутствует закрывающая фигурная скобка непосредственно перед оператором catch.

Одним из способов присвоения аргументов отдельным переменным является проверка количества аргументов:

// Init the variables to empty strings for default values.
string argHTTPS = string.Empty;
string argCustDbName = string.Empty;

if (args.Count() > 0)
{
    argHTTPS = args[0];
}

if (args.Count() > 1)
{
    argCustDbName = args[1];
}

Но, как я уже сказал, Вы ничего не делаете с этими переменными, и я понятия не имею, что такое mainObject, поэтому я думаю, что вы делаете то, что не должны делать в основном методе вашего кода запуска.


Dinesh Kumar Dora

Привет, Дэйв, спасибо за ответ. Это корпоративный конфиденциальный код, поэтому, очевидно, я не могу опубликовать всю логику или детали. Почему используется именно эта переменная? почему используется список? что такое mainobject? и т.д.. Но wrt на вопрос, какая бы ни была релевантная информация, я ее предоставил. И да, я пропустил это закрытие фигурных скобок при форматировании фрагмента кода.

В любом случае, я решил обусловить логику, основанную на количестве переданных аргументов. Это не совсем то, что я искал, но, по крайней мере, это работает. Спасибо всем за предложения.