コンソールアプリケーションのためのいくつかのコマンドライン引数を読み込むしようとしています
-
21-08-2019 - |
質問
私はかなりシンプルな.NETコンソールアプリケーションを持っています。私はいくつかのコマンドライン引数に渡さないために...そこにタフな何もしたい。
さて、キッカーは、私は通常私は1つの引数のために、中に渡したい項目のリストを持っています。この場合、ファイルのリスト。私はこれを行うための最善の方法のかわからない。
eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt
が、どのようなスペースを含むファイル名についてはどうですか?私はそれをdelimateコンマべきでしょうか?
物事を面白くするために、私は、私は二重引用符内のすべての引数のデータを置く必要があるかどうかわからないんだけど...、単一の値を受け入れ、他の引数を、持っている..
eg. myapp.exe files=aaa.txt,bbb.txt formatting=true foo=hello
または
eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
解決
おそらくプログラムのために少し遅れて、あなたが作業しているが、ここではあなたが 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"
あなたも、全体のファイルは、変数見送るとちょうどファイルとして左オーバーを扱い、myapp.exe "file 1" "file 2" "file 3"
のようにそれを呼び出すと、余分なリストからファイルを摘み取ることができます。
Mono.Optionsかなり強力です。あなたも使用する必要はありません - 、あなたが/file=
や-file=
を使用することができます表示されます。
残念ながら、Windowsは(あなたがPowerShellコマンドレットにオプションを渡している場合を除き)あなたのためのglobを行いませんので、あなたはそれを自分で行う必要があります。これは、しかし非常に簡単です、ここでのコードのビットこのです私は*.foo
または"c:\temp\*.bar|c:\temp\*.txt"
を拡大するために、過去に使用しました。
また、私はおそらく、リストを区切るカンマではないでしょう。それ以外の窓は、あなたが配管をやっていると考えて、あなたは1つがパイプが良い選択になります:-)一日あなたを噛まないように起こっていることを知っている、しかし、あなたはトーキーで式全体をラップしている場合のみ。ああ、コマンドライン処理の喜び - )
他のヒント
各引数は、任意のスペースが引用符で囲まなければなりません。そうでなければ、私はそれのうち、引用符を残してます。
あなたのシェルは、おそらくそれができるようにするのが最適ですのグロブワイルドカードをサポートしていることを考えるとプレーンな空間とするための入力ファイルは、リストを分離している場合、ファイル名は、それが引用符でまたは\文字を経由して、周囲のいずれかによってすでにエスケープされていますスペースが含まれていることを前提とします。 平野ことで私は、-Fまたは/ Fスタイルスイッチを含まないことを意味ます。
やや少ない一般的な手法が、でも、コマンドラインの解析を行うすべてのライブラリでサポートされている、フォーム-f foo.txt -f bar.txt
の複数のエントリを可能にすることです。これは、コマンドライン(上記の解決策とは違って)グロブとうまく再生されません。