Максимальная длина строки командной строки

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

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

Ответ 1

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

- Microsoft support KB статья 830473

Ответ 2

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

Ответ 3

Как @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 - это не единственный способ передать аргументы для нового процесса.

Ответ 4

В Windows 10 это все еще 8191 символов... по крайней мере, на моей машине.

Он просто обрезает любой текст после 8191 символа. Ну, на самом деле, у меня 8196 символов, а после 8196, это просто не позволит мне больше печатать.

Вот скрипт, который проверит, как долго вы можете использовать оператор. Хорошо, если у вас установлен gawk/awk.

echo rem this is a test of how long of a line that a .cmd script can generate >testbat.bat
gawk 'BEGIN {printf "echo -----";for (i=10;i^<=100000;i +=10) printf "%%06d----",i;print;print "pause";}' >>testbat.bat
testbat.bat