Comprimento Máximo da Cadeia de Linha de Comando

No Windows, qual é o comprimento máximo de uma cadeia de linha de comando? Significado se eu especificar um programa que aceita argumentos na linha de comando, como abc.exe -name=abc

Um simples aplicativo de console que eu escrevi usa parâmetros via linha de comando e eu quero saber qual é o valor máximo permitido.

Em computadores que executam o Microsoft Windows XP ou posterior, o comprimento máximo da cadeia que você pode usar no prompt de comando é 8191 caracteres.

– Artigo de suporte da Microsoft KB 830473

Desculpe por desenterrar um tópico antigo, mas acho que a resposta dos sunetos não está correta (ou não é a resposta completa). Eu fiz algumas experiências (usando ProcessStartInfo em c #) e parece que a string ‘arguments’ para um comando de linha de comando é limitada a 2048 caracteres no XP e 32768 caracteres no Win7. Eu não tenho certeza do que o limite 8191 se refere, mas eu não encontrei nenhuma evidência disso ainda.

Como @Sugrue, também estou pesquisando um tópico antigo.

Para explicar por que existe 32768 (eu acho que deveria ser 32767, mas vamos acreditar resultado teste experimental) limitação de caracteres que precisamos cavar na API do Windows.

Não importa como você inicia o programa com argumentos de linha de comando, ele vai para ShellExecute , CreateProcess ou qualquer extensão de sua versão. Essas APIs basicamente envolvem outras APIs do nível do NT que não são documentadas oficialmente. Tanto quanto eu sei que essas chamadas envolvem NtCreateProcess , que requer a estrutura OBJECT_ATTRIBUTES como um parâmetro, para criar essa estrutura InitializeObjectAttributes é usado. Neste lugar, vemos UNICODE_STRING . Então agora vamos dar uma olhada nessa estrutura:

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

Ele usa a variável USHORT (comprimento de 16 bits [0; 65535]) para armazenar o comprimento. E de acordo com isso , length indica tamanho em bytes, não caracteres. Então nós temos: 65535 / 2 = 32767 (porque WCHAR tem 2 bytes de comprimento).

Existem alguns passos para descobrir esse número, mas espero que esteja claro.


Além disso, para apoiar @sunetos responda o que é aceito. 8191 é um número máximo permitido para ser inserido em cmd.exe , se você exceder esse limite, The input line is too long. erro é gerado. Portanto, a resposta está correta, apesar do fato de que o cmd.exe não é a única maneira de passar argumentos para o novo processo.