2010-07-08 14 views
79

En Windows, lo que es la longitud máxima de una cadena de línea de comandos? Significado si especifico un programa que toma argumentos en la línea de comando como abc.exe -name=abcLongitud máxima de línea de comandos de cadena

Una aplicación de consola simple que escribí toma los parámetros a través de la línea de comando y quiero saber cuál es la cantidad máxima permitida.

+0

Y mi pregunta es .. También podemos personalizar it..if en absoluto? – eRaisedToX

+0

@eRaisedToX bien bastante vieja respuesta, pero probablemente no. Pero, ¿por qué lo necesitas en primer lugar? Responder a esta pregunta generalmente da mejores ideas. – ST3

Respuesta

63

En equipos con Microsoft Windows XP o posterior, la longitud máxima de la cadena que puede usar en el símbolo del sistema es 8191 caracteres.

- Microsoft support KB article 830473

+2

Tenga en cuenta que el pie de página de ese artículo dice que se aplica a Microsoft Windows Server 2003 [Datacenter Edition (32-bit x86), Enterprise Edition (32-bit x86), Standard Edition (32-bit x86) y Web Edition]; 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; y Microsoft Windows NT Workstation 4.0 Developer Edition. – Pops

+21

Esto solo se aplica a los programas que se ejecutan realmente a través del símbolo del sistema (según la pregunta). Los accesos directos (.lnk) están limitados a 260 caracteres, CreateProcess a 32767 y ShellExecute a aproximadamente 2048.[De acuerdo con el artículo de Raymond Chen sobre el tema] (http://blogs.msdn.com/b/oldnewthing/archive/2003/12/10/56028.aspx) – NtscCobalt

+1

Esto parece ser incorrecto para Windows 7 - vea la respuesta de Sugrue – davidfrancis

62

Lo siento por la excavación de un viejo hilo, pero creo que no es correcto sunetos' answer (o no es la respuesta completa). He hecho algunos experimentos (utilizando ProcessStartInfo en C#) y parece que las cuerdas 'argumentos' para un comando de línea de comandos está limitada a 2048 caracteres en XP y 32768 caracteres en Win7. No estoy seguro de a qué se refiere el límite 8191, pero aún no he encontrado evidencia de ello.

+1

Podría ser un artículo anterior que se escribió antes de que saliera 7. Aumentó de 2000 a XP, es razonable que haya aumentado de XP a 7 nuevamente. – anon58192932

+0

Sé que el límite de bloqueo del entorno en XP fue 2048. ¿Es esto quizás a lo que se refiere? – Lothar

+1

Según el artículo en sí, la cifra 8191 se aplica a Server 2003 y XP. La cifra de 2047 se aplica a 2000 y NT 4.0. – Pops

27

As @Sugrue También estoy desenterrando un hilo viejo.

Para explicar por qué hay 32768 (creo que debe ser 32767, pero permite creer resultado de la prueba experimental) caracteres limitación tenemos que cavar en la API de Windows.

No importa cómo inicie el programa con los argumentos de la línea de comandos va a ShellExecute, CreateProcess o cualquier versión extendida. Estas API básicamente envuelven otras API de nivel NT que no están oficialmente documentadas. Por lo que sé, estas llamadas envuelven NtCreateProcess, que requiere OBJECT_ATTRIBUTES estructura como parámetro, para crear esa estructura se usa InitializeObjectAttributes. En este lugar vemos UNICODE_STRING. Así que ahora vamos a echar un vistazo a esta estructura:

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

Utiliza USHORT (longitud de 16 bits [0; 65535]) variable para almacenar longitud. Y según this, la longitud indica el tamaño en bytes, no los caracteres. Así tenemos: 65535/2 = 32767 (porque WCHAR es de 2 bytes de longitud).

Hay algunos pasos para profundizar en este número, pero espero que sea clara.


Además, para apoyar @sunetos responder a lo que es aceptado. 8191 es un número máximo permitido que se otorgará cmd.exe, si se excede este límite, se genera The input line is too long. error. Por lo tanto, la respuesta es correcta a pesar del hecho de que cmd.exe no es la única forma de pasar argumentos para un nuevo proceso.

+0

¿No es USHORT un corto sin firmar, es decir [0, 65536]? –

+1

@UMad No, los límites son [0, 65535] :) De todos modos, gracias por señalar mi error, lo solucioné. – ST3

+0

La longitud es de hasta 32.766 caracteres porque se almacena una cadena terminada en nulo. – eryksun

Cuestiones relacionadas