Sous Windows, quelle est la longueur maximale d'une chaîne de ligne de commande? Cela signifie que si je spécifie un programme qui prend des arguments sur la ligne de commande tels queabc.exe -name=abc
Une simple application console que j'ai écrite prend des paramètres via la ligne de commande et je veux savoir quel est le montant maximum autorisé.
Réponses:
À partir de la documentation Microsoft: Limitation de la chaîne de ligne de commande de l'invite de commande (Cmd. Exe)
la source
Désolé d'avoir creusé un vieux fil, mais je pense que la 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» pour une commande en ligne de commande soit limitée à 2048 caractères sous XP et 32768 caractères sous Win7. Je ne sais pas à quoi fait référence la limite de 8191, mais je n'en ai encore trouvé aucune preuve.
la source
En tant que @Sugrue, je suis également en train de creuser un vieux fil.
Pour expliquer pourquoi il y a 32768 (je pense que cela devrait être 32767, mais croyons le résultat des tests expérimentaux), nous devons creuser dans l'API Windows.
Peu importe 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 englobent essentiellement d'autres API de niveau NT qui ne sont pas officiellement documentées. Autant que je sache, ces appels enveloppent NtCreateProcess , 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
. Alors maintenant, jetons un œil à cette structure:Il utilise la
USHORT
variable (longueur 16 bits [0; 65535]) pour stocker la longueur. Et selon cela , la longueur indique la taille en octets, pas en caractères. Nous avons donc:65535 / 2 = 32767
(car ilWCHAR
fait 2 octets de long).Il y a quelques étapes pour creuser ce nombre, mais j'espère que c'est clair.
Aussi, pour soutenir @sunetos, répondez à ce qui est accepté. 8191 est un nombre maximum autorisé à entrer
cmd.exe
, si vous dépassez cette limite, uneThe input line is too long.
erreur est générée. Donc, la réponse est correcte malgré le fait que cecmd.exe
n'est pas la seule façon de passer des arguments pour un nouveau processus.la source
ObjectAttributes
n'est utilisé que pour le descripteur de sécurité et rend le handle retourné héritable. La ligne de commande est passée dans leProcessParameters
, qui est référencé par le Process Environment Block (PEB). Avec l'ancienNtCreateProcess
, ces paramètres doivent être écrits dans le processus fils viaNtWriteVirtualMemory
. De nos jours ,NtCreateUserProcess
est utilisé, qui combine plusieurs appels à un service unique noyau - par exemple créationSection
,Process
et desThread
objets; et écrire les paramètres du processus.CreateProcessW
utilise une chaîne terminée par un nul pour la ligne de commande et le chemin de l'application. La limite est de 32 767 - 1, soit 32 766 caractères.CreateProcessW
, elle peut stocker la longueur exacte dans laUNICODE_STRING
structure et définir à la foisLength
etMaximumLength
à 65534 , c'est un argument juridique pourNtCreateProcess
.Dans Windows 10, il reste 8191 caractères ... du moins sur ma machine.
Il coupe simplement tout texte après 8191 caractères. Eh bien, en fait, j'ai 8196 caractères, et après 8196, alors ça ne me laisse plus taper.
Voici un script qui testera la durée d'une instruction que vous pouvez utiliser. Eh bien, en supposant que vous ayez installé gawk / awk.
la source