2017-04-12 5 views
5

私は、コンソールアプリケーションの引数として複数のパスを渡すためにしようとしていますが、「パスに無効な文字」エラーを取得しています。引数"C:\test\"の最後の2文字がエスケープされた二重引用符で間違っているようです。例えばC#がコマンドライン引数の一部をエスケープしないように見えるのはなぜですか?

、私はそうのようなC#で新しい空のコンソールアプリケーション作成する場合:

static void Main(string[] args) 
{ 
    Console.WriteLine(args[0]); 
    Console.ReadLine(); 
} 

と、プロジェクトのプロパティの下 - >デバッグ私はそうのようなコマンドライン引数を追加します

Project properties showing CLI Argument: "C:\test\"

その後、私の出力は次のようになります。

Command prompt showing output: C:\test"

値は/アンエスケープ評価されている場合は、なぜ\tはタブになっていないのですか?

値は非エスケープ/評価されていない場合は、なぜ\"は、二重引用符になるのでしょうか?

(注:私は私がすることによってこの問題を回避することができます知っている、例えば、末尾のバックスラッシュをトリミングなどの引数が評価さ部分的ように見える理由を私は理解する助けを求めています)

+0

関連http://stackoverflow.com/questions/17168961/how-do-i-escape-in​​-verbatim-string and http://stackoverflow.com/questions/15932279/escaping-command-line-arguments- in-c-sharp-for-urls-and-local-and-network-paths –

答えて

5

確かにこれはに関し、 Microsoft Cのコマンドライン引数ですが、これらのルールもC#に準拠していることをテストしました。コマンドラインの引数は、アプリケーションに渡される前にstring args[]配列に分割されます。

Parsing C Command-Line Arguments

  • 引数はスペースやタブのいずれかであるホワイトスペースで区切られています。二重引用符で囲まれた

  • 列は関係なく、ホワイトスペースの内に含まれる1つの引数として解釈されます。引用符で囲まれた文字列を引数に埋め込むことができます。キャレット(^)はエスケープ文字または区切り文字として認識されないことに注意してください。

  • バックスラッシュが先行する二重引用符、\「は()、リテラルの二重引用符として解釈されます」。彼らはすぐに二重引用符の前にいない限り

  • バックスラッシュは、文字通りに解釈されています。

  • 偶数個のバックスラッシュの後に二重引用符が続く場合は、バックスラッシュ(\)の各ペアに対してargv配列にバックスラッシュ()が1つ入れられ、二重引用符

  • 奇数個のバックスラッシュの後に二重引用符が続く場合は、各バックスラッシュ(\)の対でargv配列に1つのバックスラッシュ()が配置され、二重引用符は次のように解釈されます。残りのバックスラッシュによるエスケープシーケンス。リテラルの二重引用符( ")がargvに配置されます。

これらのルールは、表示されている結果に一致しているようです。

私はこれらのルールをテストするには、以下のコンソールアプリケーションを実行した次のコマンドライン引数で

static void Main(string[] args) 
{ 
    foreach (string s in args) 
    { 
     Console.WriteLine(s); 
    } 
    Console.ReadLine(); 
} 

arg1 "arg2 arg3" arg4\" "arg5\"" arg6\\\" 

出力:

arg1 
arg2 arg3 
arg4" 
arg5" 
arg6\" 

理由あなたの入力引数をがエスケープされて表示されない二重引用符は開始ストリング区切り文字と解釈され、二重引用符は先行するバックスラッシュでエスケープされ、リテラル二重引用符で終わりの区切り記号ではなく解釈されます。

+0

ありがとうございました。どのような狂気がその "ルール"のセットにつながったのか、どうやって人々が周りのフォルダ名を処理すると予想されるのだろう... –

+1

@AlexMcMillan誰かがそれらを書き下してくれてありがとう。 – khargoosh