C#命令行解析引用路径和避免转义字符

时间:2009-05-22 21:34:12

标签: c# command-line escaping

如何解析要解释为路径的命令行参数? args []包含在引用时自动连接的字符串,例如:

example.exe一二“三四”

args[0] = one
args[1] = two
args[2] = three four

但是,args []不会将“C:\ Example \”属性解析为参数。相反,它将提供参数为“C:\ Example”“(包含额外的引用。)这是由于路径中的反斜杠被视为转义字符,因此用户在命令上提供的结束引用-line成为论证的一部分。

.e.g:

example.exe一个“C:\ InputFolder”“C:\ OutuptFolder \”

args[0] = one
args[1] = C:\InputFolder"
args[2] = C:\OutputFolder"

一个简单的kludge可能是:

_path = args[i].Replace("\"", @"\");

但是,我确信这是最好的做法。如何正确解析一个包含路径的命令行,防止args []数组被不正确地填充已经为转义字符解析的stings?

注意:我不想在我的项目中包含整个命令行解析库!我只需要处理引用的路径,并希望以“手动”方式这样做。请不要推荐NConsoler,Mono或任何其他大型“厨房接收器”命令行解析库。

另请注意:据我所知,这不是一个重复的问题。虽然其他问题集中在通用命令行解析上,但这个问题特定于路径引入的问题,当它们的一部分被解释为转义序列时。

3 个答案:

答案 0 :(得分:8)

不是答案,但是来自微软在线社区支持部门Jeffrey Tan的一些background and explanation(12/7/2006):

  

注意:这不是代码失败   但是按照设计,因为背后是   通常用来逃避某些   特殊字符。还有,这个   算法与Win32命令相同   行参数解析函数   CommandLineToArgvW。见备注   部分如下:   http://msdn2.microsoft.com/en-us/library/bb776391.aspx

还可以参考FX方法Environment.GetCommandLineArgs以进一步解释斜杠处理行为。

就我个人而言,我认为这是一种拖累,我很惊讶我以前没有被它咬过。或许我有,也不知道吗?但是,使用斜杠盲目替换引号并不能解决我的问题。我正在表达这个问题,因为这让人大开眼界。

答案 1 :(得分:1)

我喜欢你的想法:

_path = args[i].Replace("\"", @"\");

它很干净,除非存在问题,否则无效。

答案 2 :(得分:1)

我有同样的挫败感。我的解决方案是使用正则表达式。我的预期输入是路径列表,其中一些可能被引用。除非引用所有最后的参数,否则上述kludge不起作用。

// Capture quoted string or non-quoted strings followed by whitespace
string exp = @"^(?:""([^""]*)""\s*|([^""\s]+)\s*)+";
Match m = Regex.Match(Environment.CommandLine, exp);

// Expect three Groups
// group[0] = entire match
// group[1] = matches from left capturing group
// group[2] = matches from right capturing group
if (m.Groups.Count < 3)
    throw new ArgumentException("A minimum of 2 arguments are required for this program");

// Sort the captures by their original postion
var captures = m.Groups[1].Captures.Cast<Capture>().Concat(
               m.Groups[2].Captures.Cast<Capture>()).
               OrderBy(x => x.Index).
               ToArray();

// captures[0] is the executable file
if (captures.Length < 3)
    throw new ArgumentException("A minimum of 2 arguments are required for this program");

有人能看到更高效的正则表达式吗?