15

質問:ファイル名と任意の文字列リストが与えられた場合、Environment.GetCommandLineArgs(およびC#/ VB )が同じ文字列リストを返すような単一のコマンドラインを作成する標準的な方法はありますか?void main(String[] args)Sub Main(args() As String)


背景:.NETがコマンドラインを引数に分割する方法は驚くほど複雑です。例:

二重引用符が2つまたは偶数の円記号の後に続く場合、後続の各円記号のペアは1つの円記号に置き換えられ、二重引用符は削除されます。二重引用符が1つだけを含む奇数の円記号の後に続く場合、先行する各ペアは1つの円記号に置き換えられ、残りの円記号は削除されます。ただし、この場合、二重引用符は削除されません。

多くの人は、単純な「すべての引数を二重引用符で囲み、既存の二重引用符をエスケープする」アプローチを試み、引数の1つに末尾の円記号が含まれるとすぐに失敗します。この問題に関して、StackOverflowにはさまざまな質問があります。例:

しかし、彼らの答えは、すべてのケースに標準的な解決策を提供するほど一般的ではないか、「反復的に」開発されているように見えます(「ああ、忘れた特別なケースがもう1つあります。追加しましょう。これで、ほとんどのケースをカバーできるはずです... ")。これは非常に一般的な問題なので、たとえば、どちらかによって自信を提供する解決策を見たいと思います

  • 信頼できるソースからのもの(おそらく、このクレイジーなコマンドラインコンベンションに関与している開発者の1人からのブログエントリ)または
  • 指定されたアルゴリズムが.NETコマンドライン要件を満たしていることの正式な証明を提供します。
4

2 に答える 2

3

このアルゴリズムは一般的なもので、比較的信頼できる情報源 (MSDN ブログ) からのものです。

于 2012-12-10T22:05:33.983 に答える
1

数年前、Microsoft は、CodePlex でコマンド ライン パーサーをリリースする予定であると発表しました (.NET Framework 4 に同梱される予定だった System.Shell.CommandLine の代わりに)。彼らが実際にこれをしたかどうかはわかりません。Microsoft の従業員によって開発されたパーサーが必要な場合は、cmdlineをご覧ください。また、 CodePlexでコマンド ライン解析を探すこともできます。

また、非常に強力なMono.Optionsを試すこともできます。

于 2012-12-10T11:29:13.967 に答える