我正在尝试将多个路径作为参数传递给控制台应用程序,但我在路径中得到了一个非法字符"错误。似乎有些事情将参数"C:\test\"
的最后两个字符误认为是转义双引号。
例如,如果我在C#中创建一个新的空控制台应用程序,如下所示:
static void Main(string[] args)
{
Console.WriteLine(args[0]);
Console.ReadLine();
}
,在项目属性下 - >调试我添加一个命令行参数,如下所示:
然后我的输出如下:
如果正在评估/取消转义价值,为什么\t
不会成为标签?
如果该值未被评估/未转义,为什么\"
会成为双引号?
(注意:我知道我可以解决这个问题,例如,修剪尾随反斜杠等。我要求帮助理解为什么参数似乎部分评估)
答案 0 :(得分:6)
不可否认,这与Microsoft C命令行参数有关,但我已经测试过C#也遵循这些规则。在传递给应用程序之前,命令行参数被分隔为string args[]
数组。
Parsing C Command-Line Arguments
参数由空格分隔,可以是空格或制表符。
由双引号括起的字符串被解释为单个参数,而不管其中包含的空格。带引号的字符串可以嵌入参数中。请注意,插入符号(^)不会被识别为转义字符或分隔符。
以反斜杠开头的双引号“”被解释为文字双引号(“)。
反斜杠按字面解释,除非它们紧跟在双引号之前。
如果偶数个反斜杠后面跟一个双引号,那么每个反斜杠(\)都会在argv数组中放置一个反斜杠(),并解释双引号(“)作为字符串分隔符。
如果奇数个反斜杠后面跟一个双引号,那么每个反斜杠(\)都会在argv数组中放置一个反斜杠(),双引号被解释为转义序列通过剩余的反斜杠,导致文字双引号(“)放在argv中。
这些规则似乎与您所看到的结果一致。
我运行了以下控制台应用程序来测试这些规则:
static void Main(string[] args)
{
foreach (string s in args)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
使用以下命令行参数:
arg1 "arg2 arg3" arg4\" "arg5\"" arg6\\\"
输出:
arg1
arg2 arg3
arg4"
arg5"
arg6\"
输入参数出现未转义的原因是第一个双引号被解释为起始字符串分隔符,第二个双引号被前面的反斜杠转义并被解释为文字双引号 - 不是结束分隔符。