Попытка прочитать некоторые аргументы командной строки для консольного приложения.
-
21-08-2019 - |
Вопрос
у меня есть довольно простое консольное приложение .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
.Это не очень хорошо сочетается с подстановкой командной строки (в отличие от приведенного выше решения).