No Windows, qual é o comprimento máximo de uma string de linha de comando? Ou seja, se eu especificar um programa que recebe argumentos na linha de comando, comoabc.exe -name=abc
Um aplicativo de console simples que escrevi usa parâmetros via linha de comando e quero saber qual é a quantidade máxima permitida.
windows
command-line
ST3
fonte
fonte
Respostas:
Na documentação da Microsoft: Limitação da string de linha de comando do prompt de comando (cmd. Exe)
fonte
Desculpe por explorar um tópico antigo, mas acho que a resposta de sunetos não está correta (ou não é a resposta completa). Eu fiz alguns experimentos (usando ProcessStartInfo em c #) e parece que a string de 'argumentos' para um comando de linha de comando é limitada a 2.048 caracteres no XP e 32768 caracteres no Win7. Não tenho certeza a que se refere o limite de 8191, mas ainda não encontrei nenhuma evidência disso.
fonte
Como @Sugrue, também estou descobrindo um tópico antigo.
Para explicar por que há 32.768 (acho que deveria ser 32.767, mas vamos acreditar no resultado do teste experimental) limitação de caracteres, precisamos examinar a API do Windows.
Não importa como você inicia o programa com argumentos de linha de comando, ele vai para ShellExecute , CreateProcess ou qualquer versão estendida. Essas APIs basicamente envolvem outras APIs de nível NT que não estão oficialmente documentadas. Pelo que eu sei, essas chamadas envolvem NtCreateProcess , que requer a estrutura OBJECT_ATTRIBUTES como um parâmetro, para criar essa estrutura InitializeObjectAttributes é usada. Neste lugar nós vemos
UNICODE_STRING
. Então, agora vamos dar uma olhada nesta estrutura:Ele usa
USHORT
a variável (comprimento de 16 bits [0; 65535]) para armazenar o comprimento. E, de acordo com isso , o comprimento indica o tamanho em bytes, não em caracteres. Portanto, temos:65535 / 2 = 32767
(porqueWCHAR
tem 2 bytes de comprimento).Existem algumas etapas para analisar 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
cmd.exe
, se você exceder esse limite, umThe input line is too long.
erro será gerado. Portanto, a resposta está correta apesar decmd.exe
não ser a única forma de passar argumentos para um novo processo.fonte
ObjectAttributes
é usado apenas para o descritor de segurança e torna o identificador retornado herdável. A linha de comando é passada noProcessParameters
, que é referenciado pelo Process Environment Block (PEB). Com o antigoNtCreateProcess
, esses parâmetros devem ser gravados no processo filho viaNtWriteVirtualMemory
. Hoje em diaNtCreateUserProcess
é usado, o que combina várias chamadas para um único serviço de kernel - por exemploSection
, criandoProcess
, eThread
objetos; e escrever os parâmetros do processo.CreateProcessW
usa uma string terminada em nulo para a linha de comando e o caminho do aplicativo. O limite é 32.767-1, ou seja, 32.766 caracteres.CreateProcessW
, ela pode armazenar o comprimento exato naUNICODE_STRING
estrutura e definir tantoLength
comoMaximumLength
65.534 , é um argumento legal paraNtCreateProcess
.No Windows 10, ainda são 8.191 caracteres ... pelo menos na minha máquina.
Ele apenas corta qualquer texto após 8.191 caracteres. Bem, na verdade, eu tenho 8.196 caracteres, e depois de 8.196, ele simplesmente não me deixa digitar mais.
Aqui está um script que testará a extensão de uma instrução que você pode usar. Bem, supondo que você tenha o gawk / awk instalado.
fonte