En Windows, ¿cuál es la longitud máxima de una cadena de línea de comando? Es decir, si especifico un programa que toma argumentos en la línea de comando comoabc.exe -name=abc
Una aplicación de consola simple que escribí toma parámetros a través de la línea de comando y quiero saber cuál es la cantidad máxima permitida.
Respuestas:
De la documentación de Microsoft: Límite de cadena de línea de comando del símbolo del sistema (Cmd. Exe)
fuente
Lo siento por desenterrar un viejo hilo, pero creo que la respuesta de sunetos no es correcta (o no es la respuesta completa). Hice algunos experimentos (usando ProcessStartInfo en c #) y parece que la cadena de '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 de 8191, pero aún no he encontrado ninguna evidencia de ello.
fuente
Como @Sugrue, también estoy desenterrando un viejo hilo.
Para explicar por qué hay 32768 (creo que debería ser 32767, pero creamos el resultado de las pruebas experimentales) limitación de caracteres, necesitamos profundizar en la API de Windows.
No importa cómo inicie el programa con argumentos de línea de comando, va a ShellExecute , CreateProcess o cualquier versión extendida. Estas API básicamente envuelven otras API de nivel NT que no están documentadas oficialmente. Hasta donde yo sé, estas llamadas envuelven NtCreateProcess , que requiere la estructura OBJECT_ATTRIBUTES como parámetro, para crear esa estructura se usa InitializeObjectAttributes . En este lugar vemos
UNICODE_STRING
. Así que ahora echemos un vistazo a esta estructura:Utiliza la
USHORT
variable (longitud de 16 bits [0; 65535]) para almacenar la longitud. Y de acuerdo con esto , la longitud indica el tamaño en bytes, no en caracteres. Entonces tenemos:65535 / 2 = 32767
(porqueWCHAR
tiene 2 bytes de longitud).Hay algunos pasos para profundizar en este número, pero espero que esté claro.
Además, para apoyar @sunetos responde lo que se acepta. 8191 es un número máximo que se puede ingresar
cmd.exe
, si excede este límite,The input line is too long.
se genera un error. Entonces, la respuesta es correcta a pesar de quecmd.exe
no es la única forma de pasar argumentos para un nuevo proceso.fuente
ObjectAttributes
que solo se usa para el descriptor de seguridad y hace que el identificador devuelto sea heredable. La línea de comando se pasa enProcessParameters
, a la que hace referencia el Bloque de entorno de proceso (PEB). Con el antiguoNtCreateProcess
, estos parámetros deben escribirse en el proceso hijo a través deNtWriteVirtualMemory
. Hoy en díaNtCreateUserProcess
se utiliza, que combina varias llamadas a un solo servicio del kernel, por ejemploSection
, la creación de objetosProcess
, yThread
; y escribir los parámetros del proceso.CreateProcessW
usa una cadena terminada en nulo para la línea de comando y la ruta de la aplicación. El límite es 32,767 - 1, es decir, 32,766 caracteres.CreateProcessW
, puede almacenar la longitud exacta en laUNICODE_STRING
estructura y establecer ambosLength
yMaximumLength
en 65,534 , es un argumento legal paraNtCreateProcess
.En Windows 10, todavía tiene 8191 caracteres ... al menos en mi máquina.
Simplemente corta cualquier texto después de 8191 caracteres. Bueno, en realidad, obtuve 8196 caracteres, y después de 8196, ya no me deja escribir más.
Aquí hay un guión que probará la duración de una declaración que puede usar. Bueno, suponiendo que tengas gawk / awk instalado.
fuente