在命令字符串上使用带有可选参数和引号的Path.GetDirectoryName

时间:2010-01-29 16:01:54

标签: .net regex parsing

我们的客户在其注册表中存储了一个字符串,这是一个可执行命令。该字符串可以或可以不具有目标路径周围的引号,并且可以具有或不具有参数。例如:

  

“C:\ path \ file.exe”param1 = value1 param2 = value2
  C:\ path \ file.exe param1 = value1 param2 = value2
  “C:\路径\ file.exe程式”
  C:\路径\ file.exe程式
  “C:\ path \ file with spaces.exe”param1 = value1 param2 = value2
  “C:\ path \ file with spaces.exe”

我需要获取目标路径的目录,即C:\path

  • 我尝试了Path.GetDirectoryName,但是因为“路径中存在非法字符”而失败了。
  • 我也尝试创建一个ProcessStartInfo对象,但似乎没有智能来解析字符串。
  • 我摆弄Uri,但也没有运气。

我有一个使用正则表达式的解决方案(我将在下面作为答案发布),但这看起来像是“必须有一个内置的.Net-helper-class-for-this “问题。

我是否缺少一个课程,或者只是没有正确使用上述课程?

2 个答案:

答案 0 :(得分:1)

这是一个有效的正则表达式。但是,正如我在我的问题中所说,有更好的方法吗?或者有这种情况会失败吗?

Regex pattern = new Regex(@"^(?<quot>"")?(?<path>(?(quot)[^""]|\S)*)", RegexOptions.ExplicitCapture);
var match = pattern.Match(value);
return Path.GetDirectoryName(match.Groups["path"].Value);

答案 1 :(得分:0)

我发布了:

var strings = value.Split(" ", 2);
var firstString = strings.Length == 0 ? string.Empty : strings[0];
return Path.GetDirectoryName(firstString ); 

然后我打了自己。

然后我看到http://community.bartdesmet.net/blogs/bart/archive/2009/02/21/net-4-0-system-shell-commandline-parsing-part-1.aspx有用吗? (虽然它看起来不像处理解析的这个方面,但它实际上并不存在!)

没有一个标准的System.IO类提供你正在寻找的任何类型的解析,所以我说你的正则表达式没问题,除非有人找到一个常见的解析。

在Reflector中,所有执行命令行解析的System.Environment代码似乎都是Native,所以我非常有信心你没有错过任何标准API用于此目的 - 这种考虑(如何文件名被表示)被认为是.NET的外部(这是有意义的,因为它是特定于平台的。)