args.Length неправильно печатает из cmd.exe, когда последним символом в аргументе является \"

Создайте консольное приложение с Visual Studio 2013 Community Edition. Напишите одну строку кода в методе 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, если первый параметр находится в кавычках, а последний символ в строке — \. Это приводит к тому, что длина аргументов равна 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

person MacGyver    schedule 18.01.2016    source источник


Ответы (1)


Вы показываете простое поведение командной строки 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'
person AdrianHHH    schedule 19.01.2016
comment
Итак, я предполагаю, что для того, чтобы решить это так, как я хочу (чтобы не заставлять конечного пользователя понимать escape-последовательности), мне нужно проанализировать один аргумент по его пробелам, а затем заменить любые кавычки символом \ для любого из разделенных струны. НО, только если в первом аргументе есть символ двойной кавычки, в противном случае используйте обычную логику для нескольких аргументов. Это хак, но я думаю, что это сработает. - person MacGyver; 19.01.2016
comment
Наконец работает. Какая халтура, но внешне красивая! :-) - person MacGyver; 21.01.2016