web-dev-qa-db-fra.com

Longueur maximale de la ligne de commande

Sous Windows, quelle est la longueur maximale d'une chaîne de ligne de commande? Signification si je spécifie un programme qui prend des arguments sur la ligne de commande tels que abc.exe -name=abc

Une application console simple que j'ai écrite prend les paramètres via la ligne de commande et je veux savoir quelle est la quantité maximale autorisée.

98
user195488

Sur les ordinateurs exécutant Microsoft Windows XP ou ultérieur, la longueur maximale de la chaîne que vous pouvez utiliser à l'invite de commande est de 8191 caractères.

- article 830473 de la base de support technique Microsoft

77
sunetos

Désolé de creuser un vieux fil, mais je pense que réponse de sunetos n'est pas correct (ou n'est pas la réponse complète). J'ai fait quelques expériences (en utilisant ProcessStartInfo en c #) et il semble que la chaîne 'arguments' d'une commande en ligne de commande soit limitée à 2048 caractères dans XP et 32768 caractères dans Win7. Je suis Je ne sais pas à quoi se réfère la limite de 8191, mais je n’ai encore trouvé aucune preuve de cela.

70
Sugrue

En tant que @Sugrue, je suis aussi en train de creuser un vieux fil.

Pour expliquer pourquoi il y a 32768 (je pense que ce devrait être 32767, mais supposons des résultats de tests expérimentaux), nous devons intégrer Dig dans l'API Windows.

Peu importe la manière dont vous lancez le programme avec des arguments en ligne de commande, il passe à ShellExecute , CreateProcess ou à toute version étendue. Ces API encapsulent essentiellement d'autres API de niveau NT qui ne sont pas officiellement documentées. Autant que je sache, ces appels encapsulent NtCreateProcess , ce qui nécessite OBJECT_ATTRIBUTES en tant que paramètre, pour créer cette structure InitializeObjectAttributes est utilisée. Dans cet endroit, nous voyons UNICODE_STRING. Voyons maintenant dans cette structure:

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

Il utilise la variable USHORT (longueur de 16 bits [0; 65535]) pour stocker la longueur. Et selon this , la longueur indique la taille en octets, pas en caractères. Nous avons donc: 65535 / 2 = 32767 (car WCHAR a une longueur de 2 octets).

Il faut quelques étapes pour creuser ce chiffre, mais j'espère que c'est clair.


Aussi, pour soutenir @sunetos, répondez à ce qui est accepté. 8191 est un nombre maximal autorisé à entrer dans cmd.exe, si vous dépassez cette limite, The input line is too long. _ erreur est générée. Donc, la réponse est correcte malgré le fait que cmd.exe n'est pas le seul moyen de passer des arguments pour un nouveau processus.

37
ST3

Dans Windows 10, il reste encore 8191 caractères ... du moins sur ma machine.

Il coupe tout texte après 8191 caractères. Eh bien, en fait, j'ai 8196 caractères et après 8196, il ne me laisse plus taper.

Voici un script qui testera la durée d'utilisation d'une instruction. Bien, en supposant que gawk/awk soit installé.

echo rem this is a test of how long of a line that a .cmd script can generate >testbat.bat
gawk 'BEGIN {printf "echo -----";for (i=10;i^<=100000;i +=10) printf "%%06d----",i;print;print "pause";}' >>testbat.bat
testbat.bat
0
Joseph Dewey