如何解析要解释为路径的命令行参数? 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或任何其他大型“厨房接收器”命令行解析库。
另请注意:据我所知,这不是一个重复的问题。虽然其他问题集中在通用命令行解析上,但这个问题特定于路径引入的问题,当它们的一部分被解释为转义序列时。
答案 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");
有人能看到更高效的正则表达式吗?