为什么C#看起来部分取消转义命令行参数?

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)

并在项目属性 - >调试下我添加一个命令行参数,如下所示:

显示CLI参数的项目属性:

然后我的输出看起来像这样:

命令提示符显示输出:C:\ test

如果正在评估/取消转义该值,为什么不\t成为标签?

如果该值未被评估/未转义,为什么会\"成为双引号?

(注意:我知道我可以解决这个问题,例如,修剪尾部反斜杠等.我正在寻求帮助,理解为什么参数似乎被部分评估)

kha*_*osh 7

不可否认,这与Microsoft C命令行参数有关,但我已经测试过C#也遵循这些规则.string args[]在传递给应用程序之前,命令行参数被分隔到数组中.

解析C命令行参数

  • 参数由空格分隔,空格可以是空格或制表符.

  • 由双引号括起的字符串被解释为单个参数,而不管其中包含的空格.带引号的字符串可以嵌入参数中.请注意,插入符号(^)不会被识别为转义字符或分隔符.

  • 带有反斜杠的双引号""被解释为文字双引号(").

  • 反斜杠按字面解释,除非它们紧跟在双引号之前.

  • 如果偶数个反斜杠后面跟一个双引号,那么每个反斜杠(\)都会在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)

输入参数未转义的原因是第一个双引号被解释为起始字符串分隔符,第二个双引号被前面的反斜杠转义并解释为文字双引号 - 而不是结束分隔符.

  • 感谢那。我想知道是什么疯狂导致了这套“规则”,以及人们应该如何处理传递文件夹名称...... (3认同)
  • @AlexMcMillan谢天谢地有人写下来了. (2认同)