2017-04-12 52 views
5

我試圖將多個路徑作爲參數傳遞給控制檯應用程序,但得到了「路徑中的非法字符」錯誤。看起來有些事情將錯誤的參數"C:\test\"的最後兩個字符誤認爲是一個轉義的雙引號。爲什麼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和http://stackoverflow.com/questions/15932279/escaping-command-line-arguments- in-c-sharp-for-urls-and-local-and-network-paths –

回答

5

誠然,這涉及到微軟C命令行參數,但我測試過這些規則也遵循C#。在傳遞給應用程序之前,命令行參數被分成string args[]數組。

Parsing C Command-Line Arguments

  • 參數用白色的空間,這可以是一個空間或製表符分隔。

  • 由雙引號括起來的字符串被解釋爲單個參數,而不管其中包含的空白。引用的字符串可以嵌入參數中。請注意,脫字符(^)不會被識別爲轉義字符或分隔符。

  • 雙引號前加反斜槓\「,被解釋爲文字雙引號(」)。

  • 反斜槓從字面上解釋,除非它們立即在雙引號之前。

  • 如果偶數個反斜槓後面跟着一個雙引號,那麼每個反斜槓(\)對將一個反斜槓()放在argv數組中,雙引號(「)被解釋爲一個字符串分隔符

  • 如果奇數個反斜槓後面跟着雙引號,則對於每對反斜槓(\)將一個反斜槓()放在argv數組中,雙引號標記解釋爲由其餘反斜槓構成的轉義序列,導致在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