【问题标题】:Why does C# appear to partially un-escape command line arguments?为什么 C# 似乎部分取消转义命令行参数?
【发布时间】:2017-04-12 02:18:27
【问题描述】:

我试图将多个路径作为参数传递给控制台应用程序,但出现“路径中的非法字符”错误。似乎有些东西将参数 "C:\test\" 的最后两个字符误认为是转义的双引号。

例如,如果我在 C# 中创建一个新的空控制台应用程序,如下所示:

static void Main(string[] args)
{
    Console.WriteLine(args[0]);
    Console.ReadLine();
}

并且,在 Project Properties -> Debug 下,我添加了一个命令行参数,如下所示:

然后我的输出如下所示:

如果值正在评估/取消转义,为什么\t 不成为选项卡?

如果值没有被评估/取消转义,为什么\" 变成双引号?

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

【问题讨论】:

标签: c# string escaping


【解决方案1】:

诚然,这与 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\"

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

【讨论】:

  • 谢谢。我想知道是什么疯狂导致了这套“规则”,以及人们应该如何处理传递的文件夹名称......
猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2014-09-10
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多