122 votes

Longueur maximale de la chaîne de la ligne de commande

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

Une application console simple que j'ai écrite prend des paramètres via la ligne de commande et je veux savoir quel est le montant maximum autorisé.

96voto

sunetos Points 2122

Dans la documentation de Microsoft : Limitation de la chaîne de commande de l'invite de commande (Cmd. exe)

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

75voto

Sugrue Points 1051

Désolé de ressortir un vieux fil, mais je pense que réponse de sunetos n'est pas correcte (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 sous XP et à 32768 caractères sous Win7. Je ne suis pas sûr de ce à quoi la limite de 8191 fait référence, mais je n'ai pas encore trouvé de preuve de cela.

47voto

ST3 Points 3064

Comme @Sugrue, je déterre aussi un vieux fil.

Pour expliquer pourquoi il y a une limitation de 32768 (je pense que ce devrait être 32767, mais croyons aux résultats des tests expérimentaux) caractères, nous devons creuser dans l'API de Windows.

Quelle que soit la façon dont vous lancez le programme avec des arguments de ligne de commande, il va à ShellExecute , CreateProcess ou toute autre version étendue. Ces API recouvrent essentiellement d'autres API de niveau NT qui ne sont pas officiellement documentées. Pour autant que je sache, ces appels enveloppent NtCreateProcess ce qui nécessite ATTRIBUTS DE L'OBJET en tant que paramètre, pour créer cette structure InitializeObjectAttributes est utilisé. A cet endroit, nous voyons UNICODE_STRING . Jetons maintenant un coup d'œil à cette structure :

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

Il utilise USHORT (longueur de 16 bits [0 ; 65535]) pour stocker la longueur. Et selon este La longueur indique la taille en octets, et non en caractères. Nous avons donc : 65535 / 2 = 32767 (parce que WCHAR a une longueur de 2 octets).

Il y a quelques étapes pour creuser ce chiffre, mais j'espère qu'il est clair.


Aussi, pour soutenir @sunetos répondre à ce qui est accepté. 8191 est un nombre maximum autorisé à être entré dans la base de données. cmd.exe si vous dépassez cette limite, The input line is too long. 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.

6voto

Joseph Dewey Points 61

Dans Windows 10, c'est toujours 8191 caractères... du moins sur ma machine.

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

Voici un script qui va tester la longueur d'une déclaration que vous pouvez utiliser. En supposant que vous avez installé gawk/awk.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X