簡體   English   中英

用於轉義.NET命令行參數的規范解決方案

[英]Canonical solution for escaping .NET command line arguments

問題 :給定文件名和任意字符串列表,是否有一種規范的方法來創建單個命令行,使得Environment.GetCommandLineArgs (和C#的void main(String[] args) / VB的Sub Main(args() As String) )將返回相同的字符串列表?


背景 :.NET將命令行拆分為參數的方式非常復雜 ,例如:

如果雙引號跟隨兩個或偶數個反斜杠,則每個前進的反斜杠對將替換為一個反斜杠,並刪除雙引號。 如果雙引號跟隨奇數個反斜杠(包括只有一個),則每個前一對用一個反斜杠替換,剩下的反斜杠被刪除; 但是,在這種情況下,雙引號不會被刪除。

許多人嘗試簡單的“將每個參數放在雙引號中並轉義現有的雙引號”方法,並且只要其中一個參數包含一個尾部反斜杠就會失敗。 有關此問題的StackOverflow存在各種問題,例如:

然而,他們的答案要么不夠通用,不能為所有案例提供規范解決方案,要么似乎是“迭代地”開發(“哦,還有一個我忘了的特殊情況,讓我們添加它, 現在它應該覆蓋大多數情況...... “)。 由於這是一個非常常見的問題,我希望看到一個解決方案,例如,通過其中任何一個提供信心

  • 來自權威來源(可能來自參與此瘋狂命令行約定的開發人員之一的博客條目)或
  • 提供給定算法滿足.NET命令行要求的正式證明。

此算法是通用的,來自相對權威的來源(MSDN博客)。

幾年前,微軟宣布他們將在CodePlex上發布一個命令行解析器(而不是應該隨.NET Framework 4一起提供的System.Shell.CommandLine)。 我不確定他們是否真的這樣做過。 如果您希望Microsoft員工開發的解析器可以查看cmdline 您還可以在CodePlex中查找命令行解析。

您也可以嘗試Mono.Options ,它非常強大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM