Попытка прочитать некоторые аргументы командной строки для консольного приложения.

StackOverflow https://stackoverflow.com/questions/1078172

Вопрос

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

Самое интересное, что обычно у меня есть СПИСОК элементов, которые я хочу передать для одного аргумента.В данном случае список файлов.Я не уверен, как лучше всего это сделать.

eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt 

а как насчет имен файлов с пробелами?Должен ли я разделить это запятой?

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

eg. myapp.exe files=aaa.txt,bbb.txt formatting=true foo=hello

или

eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
Это было полезно?

Решение

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

static void Main(string[] args)
{
    //let's try this mono.options thing shall we?
    string xapfile = null;
    var files = new List<string>();
    var p = new Mono.Options.OptionSet()
    {
        { "xap=", v => xapfile =v },
        { "file:", v => files.Add(v)}
    };
    List<string> extra = p.Parse(args);


    Console.WriteLine(@"
    xap = '{0}', 
    file(s)= {1}", 
         xapfile, 
         string.Join(",", files.ToArray())
    );
    Console.WriteLine(@"
    left overs: {0}", 
        string.Join(Environment.NewLine, extra.ToArray())
    );
    // rest of your Main here

Синтаксис вызова будет

myapp.exe --file="file 1" --file="file 2" --file="file 3"

Вы могли бы даже отказаться от всей переменной files и просто рассматривать оставшиеся файлы как файлы и называть их так: myapp.exe "file 1" "file 2" "file 3" и выдергиваем файлы из дополнительного списка.

Mono.Options довольно мощный инструмент.Вам даже не обязательно использовать --, похоже, вы можете использовать /file= или -file=

К сожалению, Windows не выполняет подстановку за вас (если только вы не передаете параметры командлету powershell), поэтому вам придется делать это самостоятельно.Хотя это довольно легко, вот немного кода, который я использовал в прошлом для расширения *.foo или "c:\temp\*.bar|c:\temp\*.txt"

Кроме того, если вы не заключите имена файлов в звуковые фильмы, я, вероятно, не буду разделять список запятыми, поскольку запятая допустима в имени файла.Вы знаете, что однажды вас укусят :-) Pipe — хороший выбор, но только если вы обернете все выражение в звуковые файлы, иначе Windows подумает, что вы используете конвейерную передачу.Ах, радости обработки командной строки :-)

Другие советы

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

Учитывая, что ваша оболочка, вероятно, поддерживает подстановка подстановочных знаков Лучше всего разрешить входным файлам быть простым списком, разделенным пробелами, и предположить, что если имя файла содержит пробелы, оно уже будет экранировано либо путем заключения в кавычки, либо с помощью символов \.Под простым я подразумеваю отсутствие переключателей стиля --f или /f.

Немного менее распространенный метод, но не поддерживаемый всеми библиотеками, выполняющими анализ командной строки, заключается в разрешении нескольких записей вида -f foo.txt -f bar.txt.Это не очень хорошо сочетается с подстановкой командной строки (в отличие от приведенного выше решения).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top