1

非常にシンプルな.NETコンソールアプリケーションがあります。いくつかのコマンドライン引数を渡したいのですが...難しいことは何もありません。

さて、キッカーは、私は通常、1つの引数のために渡したいアイテムのリストを持っています。この場合、ファイルのリスト。これを行うための最良の方法がわかりません。

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

しかし、スペースを含むファイル名はどうですか?カンマでデリケートする必要がありますか?

面白くするために、単一の値を受け入れる他の引数があります。したがって、すべての引数データを二重引用符で囲む必要があるかどうかはわかりません。

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

また

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

3 に答える 3

2

おそらく、あなたが取り組んでいるプログラムには少し遅れていますが、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

呼び出し構文は次のようになります

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

ファイル全体の変数を忘れて、残りをファイルとして扱い、それを like で呼び出してmyapp.exe "file 1" "file 2" "file 3"、余分なリストからファイルを取り出すこともできます。

Mono.Options は非常に強力です。-- を使用する必要さえありません。/file=または使用できるようです。-file=

残念ながら、Windows は (オプションを powershell コマンドレットに渡さない限り) グロビングを行わないため、自分で行う必要があります。これは非常に簡単ですが、これは私が過去に使用したコードの一部です*.foo"c:\temp\*.bar|c:\temp\*.txt"

また、ファイル名をトーキーでラップしない限り、カンマはファイル名で有効であるため、おそらくリストをカンマで区切らないでしょう。いつか噛まれることを知っています :-) パイプは良い選択ですが、式全体をトーキーでラップする場合に限ります。ああ、コマンドライン処理の喜び :-)

于 2010-02-28T06:22:09.443 に答える
0

スペースが含まれている場合は、各引数を引用符で囲む必要があります。それ以外の場合は、引用符を省略します。

于 2009-07-03T07:26:38.537 に答える
0

シェルがおそらくワイルド カード グロビングをサポートしていることを考えると、入力ファイルをスペースで区切られたプレーンなリストにすることを許可し、ファイル名にスペースが含まれている場合は、引用符で囲むか \ 文字を介して既にエスケープされていると想定するのが最善です。 . つまり、 --f または /f スタイルのスイッチが含まれていないということです。

あまり一般的ではないが、コマンド ライン解析を行うすべてのライブラリでサポートされていない手法は、フォームの複数のエントリを許可すること-f foo.txt -f bar.txtです。これは、コマンド ラインのグロビングではうまく機能しません (上記のソリューションとは異なります)。

于 2009-07-03T07:41:17.513 に答える