从任何应用程序调用默认命令行解析方法

时间:2011-08-02 23:40:18

标签: c# command-line-arguments

我传入一个复杂的字符串作为我的控制台应用程序的参数。我注意到我的Main方法中生成的string[] args数组是我想要解析的字符串。

现在,我希望能够解析此格式的字符串,并在我的框架的其他部分中获取相同的string[],以及在我的控制台应用程序/进程之外的不想重新发明轮子。我试图查看是否可以找到并调用用于解析传递给Main方法但无法找到任何内容的命令行参数的框架方法。我读了一些命令行解析选项,包括NDesk,但在我目前的情况下不能使用它。

任何人都知道这种框架方法吗?或者其他任何想法?

1 个答案:

答案 0 :(得分:1)

使用正则表达式:

string input = "this is \"a string\" separated by spaces \"with quotes\" also";
Regex r = new Regex("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
var matches = r.Matches(input);

图解说明会很好:

[^\\s\"']+匹配1个以上字符,空格或双引号

|

\"([^\"]*)\"匹配双引号内的0+个字符,而不是双引号本身

|

'([^']*)'匹配单引号内的0+个字符,而不是单引号本身

另外,我对.net Regex不太满意,但从我所知道的情况来看,在匹配群体方面它们很奇怪。为了让我得到没有引号的字符串,我不得不做这个奇怪的循环:

 var matches = r.Matches(input);
 foreach (Match match in matches)
 {
      Console.WriteLine(match.Groups[1].Value);
 }

如果您在Windows上运行,则可以进行API调用(无论pinvoke.net是什么, 支持过vista,无论pinvoke.net说什么)。显然这不是跨平台的。

[DllImport("shell32.dll", SetLastError = true)]
static extern IntPtr CommandLineToArgvW(
   [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine,
   out int pNumArgs);

示例代码here