【问题标题】:Using Path.GetDirectoryName on command string with optional parameters and quotes在带有可选参数和引号的命令字符串上使用 Path.GetDirectoryName
【发布时间】:2010-01-29 16:01:54
【问题描述】:

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

"C:\path\file.exe" 参数1=值1 参数2=值2
C:\path\file.exe param1=value1 param2=value2
"C:\path\file.exe"
C:\path\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 "问题。

是否有我遗漏的课程,或者只是没有正确使用上面的课程?

【问题讨论】:

  • 副话题...你能把 anything 放在这些注册表项中吗?
  • @Austin:我们需要该值作为 WiX 安装中自定义操作的一部分。该字符串由我们之前使用的安装程序软件放置在那里。因此,它受到了一些限制,但上述格式都是可能的。我不担心处理值不是有效命令字符串的情况。那只会失败。

标签: .net regex parsing


【解决方案1】:

这是一个有效的正则表达式。但是,就像我在问题中所说的那样,有更好的方法吗?或者在某些情况下会失败?

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

【讨论】:

  • 对于手头的具体任务,我觉得还可以。
【解决方案2】:

我已经发布了:

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 代码似乎都是本机的,所以我非常有信心您不会为此目的错过任何标准 API - 这种类型的考虑(文件名如何被表示)被认为是 .NET 外部的(这是有道理的,因为它是特定于平台的)。

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 2012-06-27
    • 2019-11-20
    • 1970-01-01
    • 2015-02-02
    • 2019-04-05
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多