Какова максимальная длина строки командной строки в Windows? Это означает, что я укажу программу, которая принимает аргументы в командной строке, напримерabc.exe -name=abc
Написанное мною простое консольное приложение принимает параметры через командную строку, и я хочу знать, какова максимально допустимая сумма.
Ответы:
Из документации Microsoft: Командная строка (Cmd. Exe) ограничение строки командной строки
источник
Извините за то, что выкопал старую ветку , но я думаю, что ответ sunetos неверен (или не является полным ответом). Я провел несколько экспериментов (используя ProcessStartInfo в C #), и мне кажется, что строка «arguments» для команды командной строки ограничена 2048 символами в XP и 32768 символами в Win7. Я не уверен, что означает ограничение 8191, но я пока не нашел никаких доказательств этого.
источник
Как @Sugrue я также выкапываю старую ветку.
Чтобы объяснить, почему существует ограничение на 32768 символов (я думаю, это должно быть 32767, но давайте поверить в результат экспериментального тестирования), нам нужно покопаться в Windows API.
Независимо от того, как вы запускаете программу с аргументами командной строки, она переходит в ShellExecute , CreateProcess или любую расширенную их версию. Эти API-интерфейсы в основном охватывают другие API уровня NT, которые официально не документированы. Насколько мне известно, эти вызовы охватывают NtCreateProcess , который требует в качестве параметра структуры OBJECT_ATTRIBUTES , для создания этой структуры используется InitializeObjectAttributes . В этом месте мы видим
UNICODE_STRING
. Итак, теперь давайте взглянем на эту структуру:Он использует
USHORT
переменную (16-битная длина [0; 65535]) для хранения длины. И в соответствии с этим длина указывает размер в байтах, а не в символах. Итак, у нас есть:65535 / 2 = 32767
(потому чтоWCHAR
это 2 байта).Есть несколько шагов, чтобы разобраться в этом числе, но я надеюсь, что это понятно.
Также, чтобы поддержать @sunetos, ответьте, что принято. 8191 - это максимальное число, которое можно ввести
cmd.exe
, если вы превысите этот предел,The input line is too long.
будет сгенерирована ошибка. Итак, ответ правильный, несмотря на то, чтоcmd.exe
это не единственный способ передать аргументы новому процессу.источник
ObjectAttributes
только для дескриптора безопасности и делает возвращаемый дескриптор наследуемым. Командная строка передается в, наProcessParameters
который ссылается блок среды процесса (PEB). В старой версииNtCreateProcess
эти параметры должны быть записаны в дочерний процесс черезNtWriteVirtualMemory
. В настоящее времяNtCreateUserProcess
используется, который сочетает в себе несколько звонков в единую службу ядра - например , созданиеSection
,Process
иThread
объекты; и запись параметров процесса.CreateProcessW
использует строку с завершающим нулем для командной строки и пути приложения. Предел составляет 32 767 - 1, то есть 32 766 символов.CreateProcessW
, она может сохранить точную длину вUNICODE_STRING
структуре и установить для обоихLength
иMaximumLength
65 534 , это юридический аргумент в пользуNtCreateProcess
.В Windows 10 это все еще 8191 символ ... по крайней мере, на моей машине.
Он просто обрезает любой текст после 8191 символа. Ну, на самом деле у меня 8196 символов, а после 8196 он просто не позволяет мне больше печатать.
Вот сценарий, который проверит, как долго вы можете использовать инструкцию. Ну, если у вас установлен gawk / awk.
источник