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