Максимальная длина строки командной строки - PullRequest
95 голосов
/ 08 июля 2010

В Windows, какова максимальная длина строки командной строки?Это означает, что если я укажу программу, которая принимает аргументы в командной строке, такие как abc.exe -name=abc

Простое консольное приложение, которое я написал, принимает параметры через командную строку, и я хочу знать, каково максимально допустимое количество.

Ответы [ 3 ]

74 голосов
/ 08 июля 2010

На компьютерах, работающих под управлением Microsoft Windows XP или более поздней, максимальная длина строки, которую можно использовать в командной строке, составляет 8191 символ.

- Статья базы знаний Майкрософт по поддержке830473

68 голосов
/ 03 апреля 2012

Извините за то, что выкопал старую ветку, но я думаю ответ sunetos неправильный (или не полный ответ).Я провел несколько экспериментов (используя ProcessStartInfo в c #), и кажется, что строка аргументов для команды командной строки ограничена 2048 символами в XP и 32768 символами в Win7.Я не уверен, к чему относится ограничение в 8191, но я пока не нашел никаких доказательств этого.

36 голосов
/ 11 февраля 2015

Как @Sugrue, я также копаю старую ветку.

Чтобы объяснить, почему существует ограничение в 32768 (я думаю, это должно быть 32767, но давайте поверим в результат экспериментального тестирования) ограничение, которое нужно копать в Windows API.

Независимо от того, как вы запускаете программу с аргументами командной строки, она переходит к ShellExecute , CreateProcess или любой расширенной их версии. Эти API-интерфейсы в основном обертывают другие API-интерфейсы уровня NT, которые официально не документированы. Насколько мне известно, эти вызовы обертывают NtCreateProcess , для которого требуется структура OBJECT_ATTRIBUTES в качестве параметра, для создания этой структуры используется InitializeObjectAttributes . В этом месте мы видим UNICODE_STRING. Итак, теперь давайте посмотрим на эту структуру:

typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} UNICODE_STRING;

Для хранения длины используется переменная USHORT (длина 16 бит [0; 65535]). И согласно это , длина указывает размер в байтах, а не в символах. Итак, у нас есть: 65535 / 2 = 32767 (потому что WCHAR имеет длину 2 байта).

Есть несколько шагов, чтобы покопаться в этом числе, но я надеюсь, что оно понятно.


Также, чтобы поддержать @sunetos, ответьте, что принято. 8191 - максимально допустимое число, которое можно ввести в cmd.exe, если вы превысите этот предел, будет сгенерирована ошибка The input line is too long.. Таким образом, ответ правильный, несмотря на то, что cmd.exe - не единственный способ передать аргументы для нового процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...