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"
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top