Tentando ler em alguns argumentos de linha de comando para um aplicativo de console
-
21-08-2019 - |
Pergunta
Eu tenho um muito simples aplicativo de console .NET. Eu gostaria de passar em alguns argumentos de linha de comando ... nada difícil lá.
Agora, o kicker é, eu geralmente têm uma lista de itens i desejam passar, por um argumento. Neste caso, uma lista de arquivos. Eu não tenho certeza da melhor maneira de fazer isso.
eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt
mas que sobre nomes de arquivos com espaços? Devo vírgula delimate-lo?
para fazer coisas interessantes, eu tenho outros argumentos, que aceitam valores individuais .. então eu não tenho certeza se eu deveria colocar todos os dados arg entre aspas ..
eg. myapp.exe files=aaa.txt,bbb.txt formatting=true foo=hello
ou
eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
Solução
Provavelmente um pouco tarde para o programa que está a trabalhar, mas aqui está como você pode fazê-lo usando Mono.Options
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
Chamando sintaxe seria
myapp.exe --file="file 1" --file="file 2" --file="file 3"
Você pode até mesmo forgo toda a variável de arquivos e apenas tratar os overs esquerdos como os arquivos, e chamá-lo como myapp.exe "file 1" "file 2" "file 3"
e arrancar os arquivos fora da lista extra.
Mono.Options é muito poderoso. Você não tem sequer a usar -, parece que você pode usar /file=
ou -file=
Infelizmente, o Windows não faz englobamento para você (a menos que você está passando as opções para um cmdlet PowerShell), então você tem que fazê-lo sozinho. É muito fácil, porém, aqui está um pouco de código Eu tenho usado no passado para expandir *.foo
ou "c:\temp\*.bar|c:\temp\*.txt"
Além disso, a menos que você envolva os nomes de arquivos em talkies, eu provavelmente não vírgula separar a lista, como vírgula é válido em um nome de arquivo. Você sabe que está indo para mordê-lo um dia :-) Cachimbo faz uma boa escolha, mas só se você quebrar a expressão inteira no talkies, caso contrário, janelas pensa que está fazendo tubulação. Ah, as alegrias de processamento de linha de comando: -)
Outras dicas
Cada argumento, se contiver quaisquer espaços devem estar entre aspas. Caso contrário, eu deixaria citações fora dele.
Tendo em conta que o seu shell provavelmente suporta wild card englobamento é melhor para permitir os arquivos de entrada para ser um espaço simples lista separada e supor que, se o nome do arquivo contém espaços que terão sido já escapou quer por envolvente com aspas ou via \ caracteres. Por planície Quero dizer não contêm --f ou / f interruptores de estilo.
Uma técnica um pouco menos comum, mas nem apoiado por todas as bibliotecas que fazem a análise de comando, é permitir várias entradas do -f foo.txt -f bar.txt
formulário. Esta não joga bem com linha de comando englobamento (ao contrário da solução acima).