2010-07-08 6 views
79

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 queLongueur maximale de la ligne de commande

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

+0

Et ma question est .. Aussi pouvons-nous le personnaliser..if du tout? – eRaisedToX

+0

@ eRaisedToX bien vieille réponse, mais probablement non. Mais pourquoi avez-vous besoin de cela en première place? Répondre à cette question donne généralement de meilleures idées. – ST3

Répondre

63

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

- Microsoft support KB article 830473

+2

Notez que le pied de page de cet article indique qu'il s'applique à Microsoft Windows Server 2003 [Datacenter Edition (32 bits x86), Enterprise Edition (32 bits x 86), Standard Edition (32 bits x 86) et Web Edition]; Microsoft Windows XP Édition familiale; Microsoft Windows XP Professionnel; Microsoft Windows 2000 [Serveur avancé, Édition professionnelle, Serveur]; Microsoft Windows NT Server 4.0 Édition Standard; et Microsoft Windows NT Workstation 4.0 Developer Edition. – Pops

+21

Ceci s'applique uniquement aux programmes réellement exécutés via l'invite de commande (selon la question). Les raccourcis (.lnk) sont limités à 260 caractères, CreateProcess à 32767 et ShellExecute à environ 2048.[Selon l'article de Raymond Chen sur le sujet] (http://blogs.msdn.com/b/oldnewthing/archive/2003/12/10/56028.aspx) – NtscCobalt

+1

Cela semble être incorrect pour Windows 7 - voir la réponse de Sugrue – davidfrancis

62

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

+1

Pourrait être un ancien article qui a été écrit avant 7 est sorti. Il a augmenté de 2000 à XP, il est raisonnable de passer de XP à 7 à nouveau. – anon58192932

+0

Je sais que la limite de bloc d'environnement dans XP était 2048. Est-ce que c'est peut-être ce que vous référez. – Lothar

+1

Selon l'article lui-même, la figure 8191 s'applique à Server 2003 et XP. Le chiffre de 2047 s'applique à 2000 et à NT 4.0. – Pops

27

Comme @Sugrue, je suis également en train de creuser un ancien thread. Pour expliquer pourquoi il y a 32768 (je pense qu'il devrait être 32767, mais laisse croire que les tests expérimentaux résultent) la limitation des caractères, nous devons creuser dans Windows API.

Peu importe comment vous lancez le programme avec les arguments de la ligne de commande, il va à ShellExecute, CreateProcess ou étendu leur version. Ces API enveloppent 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 la structure OBJECT_ATTRIBUTES en tant que paramètre, pour créer cette structure InitializeObjectAttributes est utilisé. Dans cet endroit, nous voyons UNICODE_STRING. Donc, permet maintenant de jeter un coup d'oeil dans cette structure:

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

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

Il y a quelques étapes à creuser dans ce nombre, mais j'espère que c'est clair.


De même, pour supporter @sunetos, répondez à ce qui est accepté. 8191 est un nombre maximum autorisé à être entré dans cmd.exe, si vous dépassez cette limite, l'erreur 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.

+0

USHORT n'est-il pas un short non signé, c'est-à-dire [0, 65536]? –

+1

@UMad Non, les limites sont [0, 65535] :) Quoi qu'il en soit, merci de me signaler mon erreur, corrigez-le. – ST3

+0

La longueur peut atteindre 32 766 caractères car une chaîne terminée par un caractère nul est stockée. – eryksun

Questions connexes