2010-07-08 5 views
79

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

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

+0

И мой вопрос .. Также мы можем его настроить ... или вообще? – eRaisedToX

+0

@eRaisedToX хорошо довольно старый ответ, но, вероятно, нет. Но зачем вам это на первом месте? Ответ на этот вопрос обычно дает лучшие идеи. – ST3

ответ

63

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

- Microsoft support KB article 830473

+2

Обратите внимание, что нижний колонтитул этой статьи гласит, что он применяется к Microsoft Windows Server 2003 [Datacenter Edition (32-разрядная x86), корпоративная версия (32-разрядная x86), стандартная версия (32-разрядная x86) и веб-версия]; Microsoft Windows XP Home Edition; Microsoft Windows XP Professional; Microsoft Windows 2000 [Advanced Server, Professional Edition, Server]; Microsoft Windows NT Server 4.0 Standard Edition; и Microsoft Windows NT Workstation 4.0 Developer Edition. – Pops

+21

Это относится только к программам, которые фактически выполняются в командной строке (по каждому вопросу). Ярлыки (.lnk) ограничены 260 символами, CreateProcess до 32767 и ShellExecute до 2048.[Согласно статье Раймонда Чена по этому вопросу] (http://blogs.msdn.com/b/oldnewthing/archive/2003/12/10/56028.aspx) – NtscCobalt

+1

Это выглядит неправильно для Windows 7 - см. Ответ Сугрю – davidfrancis

62

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

+1

Может быть, старая статья, написанная до выхода 7. Он увеличился с 2000 до XP, разумно, что он увеличился с XP до 7 снова. – anon58192932

+0

Я знаю, что ограничение среды в XP было 2048. Возможно, это то, о чем вы говорите. – Lothar

+1

Согласно самой статье, показатель 8191 относится к Server 2003 и XP. Цифра 2047 относится к 2000 году и NT 4.0. – Pops

27

Как @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]) переменной для хранения длины. И согласно this, длина указывает размер в байтах, а не на символы. Итак, у нас есть: 65535/2 = 32767 (потому что WCHAR имеет длину 2 байта).

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


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

+0

Не является USHORT беззнаковым коротким, т. Е. [0, 65536]? –

+1

@UMad Нет, пределы [0, 65535] :) Во всяком случае, спасибо, что указали мою ошибку, исправили ее. – ST3

+0

Длина - до 32 766 символов, поскольку сохраняется строка с нулевым завершением. – eryksun

Смежные вопросы