2011-04-25 40 views
2

我期待用一組給定的參數產生一個命令,並且這些參數可以是任意字符串 - 特別是,一個參數可以包含空格,冒號等。我喜歡這樣做,而不必逃避參數字符串,主要是因爲我發現它幾乎不可避免地導致在某個點上過度,不足或錯誤逃脫。如何使用任意參數字符串乾淨地產生一個進程

據我所知,沒有辦法使用System.Diagnostics.Process API來做到這一點 - ProcessStartInfo.Arguments總是將字符串分割成空白字符,並對其他字符有特殊的解釋。我目前正在做的是產生xargs --null(我正在Linux上開發)使用命令運行並通過stdin爲其提供參數。這是有效的,但不會爲最美麗的解決方案贏得任何獎項。

有沒有更好的.NET API來做我想做的事?

編輯:例如,考慮想要通過參數「I am a filename with crazy characters "'%1!#\^*☺」 fear my splitting。這是可能的 - 據我所知所有需要發生的是扔"圍繞它,然後逃脫嵌入"\。只是不必逃避它會更清晰,更簡單,並且不太可能出錯。

+0

如果最終出錯*任何*,您的代碼至少有一個錯誤。找到並修復它。 – Jon 2011-04-25 11:28:35

+0

這就是我想要做的。通過移除* need *來轉義來修復錯誤轉義。我的經驗是,逃避很難一直得到絕對正確的,所以我想 - *和可以* - 避免它! – RAOF 2011-04-26 00:43:57

回答

2

我不認爲傳遞幾個參數到一個程序是在Windows中正確標準化。當您啓動一個進程時,您可以將命令行傳遞給可執行文件。但是如何解釋這個命令行,取決於該程序。

從理論上講,每個程序都可以使用不同的方案將命令行分割爲單個參數以及轉義空格,引號和特殊字符。

實際上,大多數程序都會使用VisualStudio C標準庫的命令行分割。如果您已經安裝了VisualStudio中(含的C/C++的部分),你會發現在命令行中的文件C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\stdargv.c

在解析代碼。如果我理解正確的代碼,規則很簡單:

  • 幾個參數用空格(空格和製表符)
  • 參數可以用雙引號(他們有他們是否包含空格)
  • 如果參數包含雙引號標註分隔,雙引號必須是用斜槓逃脫
  • 當且僅當它們後面跟着雙引號時,反斜槓必須翻倍。

爲了構建一個有效的命令行,這些規則應該直接實現。但據我所知,沒有提供此功能的Windows或C#函數。

+0

啊。如果Windows本身不支持它,BCL缺乏對此的支持會更有意義。叉/執行它! – RAOF 2011-05-02 01:10:51

相關問題