передать параметр, не беспокоясь о заказах exe c# - PullRequest
0 голосов
/ 07 мая 2020

Попытка передать параметр, не задумываясь о порядке следования параметров. Первая строка - это то, что я хочу сделать, а ниже - то, что я могу сделать.

То, что я хочу, где оба должны давать одинаковый результат

test.exe -word1 hello -word2 bye
test.exe -word2 bye -word1 hello

Что у меня есть

test.exe hello bye

static void Main(string[] args)
        {
            console.line(args[0])
            console.line(args[1])
        }

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Вы можете использовать CommandLineApplication из https://www.nuget.org/packages/Microsoft.Extensions.CommandLineUtils

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

Например:

    var app = new CommandLineApplication()
    {
        Description = "CLI tool for copying messages from one queue to another",
        Name = "copy-queue",
    };

    var sourceOption = _app.Option("--source|-s", $"The source queue name", CommandOptionType.SingleValue);
    var destinationOption = _app.Option("--destination|-d", $"The destination queue name", CommandOptionType.SingleValue);
    var profileOption = _app.Option("--profile|-p", $"AWS CLI profile (default: default)", CommandOptionType.SingleValue);
    var regionOption = _app.Option("--region|-r", $"AWS region (default: us-east-1)", CommandOptionType.SingleValue);
    var batchSizeOption = _app.Option("--batch-size|-b", $"Batch size (default: 10)", CommandOptionType.SingleValue);

    _app.HelpOption("--help|-h|-?");

    var name = Assembly.GetEntryAssembly().GetName();
    _app.VersionOption("--version", name.Name + " " + name.Version);


    _app.Invoke = () => ExecuteAsync().Result;

    try
    {
        return _app.Execute(args);
    }
    catch (CommandParsingException cpe)
    {
        Console.WriteLine(cpe.Message);
        return 1;
    }
1 голос
/ 07 мая 2020

Вместо этого вы можете использовать строковый ввод:

test.exe -word1=hello -word2=bye
test.exe -word2=bye -word1=hello

, а затем вы можете сделать что-то вроде этого:

static void Main(string[] args)
        {
            // Single if the param is needed, else SingleOrDefault (to get null if the param. was not found
            var word1 = args.Single(c => c.startsWith("-"+nameof(word1))
                            .Split(new char[] {'='})
                            .Last();
            var word2 = args.Single(c => c.startsWith("-"+nameof(word2))
                            .Split(new char[] {'='})
                            .Last();                            
        }

это псевдокод, я не запускал его - просто чтобы дать вам пример.

Я бы даже не стал беспокоиться, а просто вбил: https://github.com/Tyrrrz/CliFx

0 голосов
/ 07 мая 2020

Я предполагаю, что в вашем примере word1 будет иметь значение "hello", но может иметь любое другое значение, и это значение вас интересует. С помощью Array.IndexOf вы можете найти индекс, а затем получить строку с индексом на один выше:

int index1 = Array.IndexOf(args, "-word1");
string word1 = args[index1+1];
int index2 = Array.IndexOf(args, "-word2");
string word2 = args[index2+1];

Вы также можете проверить границы массива (index1 < args.Length-1 ) и что index1 и index2 не равны -1 и при необходимости отображают соответствующее сообщение об ошибке.

...