当参数中的最后一个字符是 \" 时,args.Length 从 cmd.exe 错误打印

args.Length prints incorrectly from cmd.exe when last character in argument is a \"

使用 Visual Studio 2013 社区版创建控制台应用程序。在Main方法下写一行代码。从命令提示符调用程序。

    static void Main(string[] args)
    {
        Console.WriteLine(args.Length);

用两个参数调用程序。在 Windows 10 中,它打印 1。

"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:\" a2

编辑:

如果第一个参数在引号内且字符串中的最后一个字符是 \,则长度变为 1。这导致 args 的长度为 1。为什么会这样?我意识到 \" 表示 C# 字符串中的引号,但为了使控制台应用程序直观,最好修复代码中的错误,而不是强迫最终用户记住添加额外的 \\" 之前正确转义命令行实用程序中的反斜杠。

损坏(args.Length = 1):

"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:\" a2

未损坏(args.Length = 2):

"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:" a2

您展示的是简单的 Windows 命令行行为。 \ 表示双引号不结束字符串(即参数)。尝试 运行 一个程序来准确显示参数是如何处理的。在我的 Windows 10 电脑上我尝试了这个程序:

static void Main(string[] args)
{
    Console.WriteLine("There are {0} arguments", args.Length);
    int argIndex = 0;
    foreach (string ss in args)
    {
        Console.WriteLine("    {0,3}:  '{1}'", argIndex, ss);
        argIndex++;
    }
}

它给出了这些输出。请注意,\ 转义了双引号,但它不是结果字符串的一部分。

C:\>showarguments ab c
There are 2 arguments
      0:  'ab'
      1:  'c'

C:\>showarguments "C:\" a2
There are 1 arguments
      0:  'C:" a2'

C:\>showarguments "C:" a2
There are 2 arguments
      0:  'C:'
      1:  'a2'