Quelles sont les raisons techniques pour limiter à 1024 caractères
Après avoir utilisé Linux au cours des 3 dernières années, de nombreux problèmes liés à Windows 7 Pro me dérangeaient dans mon travail quotidien. Les plus absurdes sont la limite de nom de fichier et la variable d’environnement oubliées . Je me rends compte que MSDN indique que la limite du système combiné ENV est de 1024, mais pourquoi? J'ai un grand ensemble de variables de chemin d'utilisateur. Cela fonctionne bien, à moins que je ne le laisse pendant un moment. Puis tout à coup, la reconnaissance de la valeur PATH cessera de se produire jusqu'à ce que je redémarre.
Comment Windows stocke-t-il les valeurs ENV qui seraient à l'origine de cette limite imposée? Comment cette valeur serait-elle corrompue lors d'une utilisation normale?
MSDN https://support.Microsoft.com/en-us/kb/906469
Mettre à jour Par souci d'exhaustivité, je vais décrire les situations où je rencontre le problème mentionné. Je configure normalement User Env PATH via le dialogue d'environnement dans les paramètres système. Des choses comme msbuild, vstest.console.exe, tf.exe que je lance tout en développant. J'utilise presque exclusivement PowerShell v4 dans ConEmu. Après quelques heures ou un jour de disponibilité, ces commandes cessent soudainement de répondre comme elles sont reconnues. Réinitialiser ou modifier les valeurs via la boîte de dialogue ou la ligne de commande Env ne restaure pas la fonctionnalité. Bien que l'écho de $ env: PATH affiche les valeurs correctes. Le redémarrage était la seule solution que j'ai trouvée.
La limite à laquelle vous faites référence n'est pas 1024 octets. Comme expliqué dans l'article que vous avez lié à cela, il s'agissait d'un bogue, avec un correctif disponible.
L'article dit explicitement que la limite est de 2048 octets pour la fonction CreateEnvironmentBlock
.
De plus, le bogue était spécifique à deux anciennes versions de Windows (XP et Server 2003).
Lorsqu'une application appelle la fonction CreateEnvironmentBlock pour récupérer les variables d'environnement sur un ordinateur Microsoft Windows Server 2003 ou Microsoft Windows XP, la variable d'environnement de chemin d'accès renvoyée est tronquée à 1 024 octets. Ce problème se produit même si la taille maximale d'une variable d'environnement est 2 048 octets. Ce problème empêche l'application d'obtenir la variable d'environnement correcte.
La limite réelle est de 32 760 caractères. Cependant, il est peu probable que vous atteigniez ce maximum théorique en pratique.
Un fichier de commandes est contraint par la longueur maximale de la ligne de commande, car la variable d'environnement doit tenir dans le tampon de ligne de commande du processeur de commandes.
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.
L'invite de commande ignore toutes les variables d'environnement héritées du processus parent et dépasse sa propre limite de 8191 caractères.
La définition de la clé de registre Environment a une limite de 2048 caractères dans le code qui analyse cette clé de registre et crée un bloc d'environnement à partir de celle-ci.
Sources documentées ci-dessous.
PATH
) serait-elle corrompue lors d'une utilisation normale?Comme expliqué ultérieurement, cela peut se produire si le système PATH
est modifié pour comporter plus de 1920 caractères.
Vous n’avez pas fourni suffisamment d’informations dans votre question pour établir un diagnostic précis sur les raisons de cette situation.
PATH
de grande tailleIl existe une limite spécifique à la variable d'environnement PATH
.
Pour que la variable utilisateur PATH
puisse être fusionnée avec la variable système PATH
, la variable système PATH
doit comporter <1920 caractères.
Découvert que sur Windows Server 2003, une fois que le système PATH a passé 1920 caractères, la variable d'environnement utilisateur
PATH
n'est plus fusionnée pour définir la variable d'environnement processusPATH
, même si le système completPATH
(même s'il est plus volumineux) sera inclus dans la variable de processusPATH
.
Source echo% PATH% s'étend-t-il uniquement au système ou également aux variables utilisateur? répondez par David Heffernan
Limite maximale de longueur de chemin
Dans l'API Windows (à quelques exceptions près décrites dans les paragraphes suivants), la longueur maximale d'un chemin est MAX_PATH, définie à 260 caractères.
Un chemin local est structuré dans l'ordre suivant: lettre de lecteur, deux points, barre oblique inversée, nom des composants séparés par des barres obliques inverses et un caractère nul de fin.
Par exemple, le chemin maximal sur le lecteur D est
D:\some 256-character path string<NUL>
, où<NUL>
représente le caractère null de fin invisible pour la page de code système actuelle. (Les caractères<
et>
sont utilisés ici pour des raisons de clarté visuelle et ne peuvent pas faire partie d'une chaîne de chemin valide.)Remarque: Les fonctions d'E/S de fichier dans l'API Windows convertissent "/" en "\" dans le cadre de la conversion du nom en un nom de style NT, sauf si vous utilisez le préfixe "\? \" Comme indiqué dans les sections suivantes.
L'API Windows comporte de nombreuses fonctions qui comportent également des versions Unicode permettant un chemin d'accès étendu pour une longueur totale maximale de 32 767 caractères.
- Ce type de chemin est composé de composants séparés par des barres obliques inverses, chacune jusqu’à la valeur renvoyée dans le paramètre
lpMaximumComponentLength
de la fonctionGetVolumeInformation
(cette valeur est généralement de 255 caractères). Pour spécifier un chemin de longueur étendue, utilisez le préfixe "\? \". Par exemple, "\?\D:\très long chemin".Remarque: le chemin maximal de 32 767 caractères est approximatif, car le préfixe "\? \" Peut être étendu à une chaîne plus longue par le système au moment de l'exécution, et cette extension s'applique à la longueur totale.
Source noms, fichiers, chemins et espaces de noms
La longueur maximale théorique d'une variable d'environnement est d'environ 32 760 caractères. Cependant, il est peu probable que vous atteigniez ce maximum théorique en pratique.
Toutes les variables d'environnement doivent cohabiter dans un seul bloc d'environnement, limité à 32767 caractères.
Mais ce nombre est la somme de tous les noms et valeurs de variables d’environnement. Vous pouvez donc atteindre cette longueur maximale théorique si vous supprimez toutes les variables d’environnement, puis définissez une seule variable appelée X avec cette valeur vraiment énorme de 32 760 caractères.
En pratique, bien sûr, vous devez partager le bloc d’environnement avec toutes les autres variables du bloc. Il est donc peu probable que votre appel aléatoire à
SetEnvironmentVariable
avec une chaîne de 32 760 caractères aboutisse.Mais ce n’est pas votre seule limite pratique.
Cela dépend également de la manière dont vous définissez la variable. c’est-à-dire le code que votre technique de paramétrage de variable d’environnement passe avant qu’elle parvienne à l’appel
SetEnvironmentVariable
.Si vous utilisez un fichier de commandes, la longueur de ligne de commande maximale vous contraint, car la variable d’environnement doit tenir dans le tampon de ligne de commande du processeur de traitement par lots.
D'autre part, vous définissez peut-être la clé de registre Environment, auquel cas vous rencontrez une limite de 2048 caractères dans le code qui analyse cette clé de registre et crée un bloc d'environnement à partir de celle-ci.
Il existe également une limite dans la boîte de dialogue pour la définition interactive de variables d’environnement, la valeur numérique dont je n’ai pas connaissance par hasard.
Source Quelle est la longueur maximale d'une variable d'environnement? par Raymond Chen (un employé de Microsoft).
Cmd.exe
) limitation de chaîne de ligne de commandeSur 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. Sur les ordinateurs exécutant Microsoft Windows 2000 ou Windows NT 4.0, la longueur maximale de la chaîne que vous pouvez utiliser à l'invite de commande est de 2047 caractères.
Cette limitation s'applique à la ligne de commande, aux variables d'environnement individuelles (telles que la variable PATH) héritées par d'autres processus et à toutes les extensions de variables d'environnement. Si vous utilisez l'invite de commande pour exécuter des fichiers de commandes, cette limitation s'applique également au traitement de fichiers de commandes.
Exemples
La liste suivante vous donne quelques exemples d'application de cette limitation aux commandes que vous exécutez dans une invite de commande et aux commandes que vous utilisez dans un fichier de traitement par lots.
Dans l'invite de commandes, la longueur totale de la ligne de commande suivante que vous utilisez dans l'invite de commandes ne peut pas contenir plus de 2047 caractères, soit 8191 (selon le système d'exploitation utilisé):
cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
Dans un fichier de commandes, la longueur totale de la ligne de commande suivante que vous utilisez dans le fichier de commandes ne doit pas contenir plus de 2047 caractères ou 8191 (selon le système d'exploitation utilisé):
cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
Cette limitation s'applique aux lignes de commande contenues dans les fichiers de commandes lorsque vous utilisez l'invite de commandes pour exécuter le fichier de commandes.
Dans l'invite de commande, la longueur totale de EnvironmentVariable1 après avoir développé EnvironmentVariable2 et EnvironmentVariable3 ne peut pas contenir plus de 2047 ou 8191 caractères (selon le système d'exploitation utilisé):
c:> set EnvironmentVariable1=EnvironmentVariable2EnvironmentVariable3
Dans un fichier de traitement par lots, la longueur totale de la ligne de commande suivante une fois que vous avez développé les variables d'environnement de la ligne de commande ne peut pas contenir plus de 2047 caractères, soit 8191 caractères (selon le système d'exploitation utilisé):
ExecutableFile.exe parameter1 parameter2
Bien que la limitation Win32 pour les variables d'environnement soit de 32 767 caractères, l'invite de commande ignore toutes les variables d'environnement héritées du processus parent et dépasse ses propres limites de 2047 ou 8191 caractères (selon le système d'exploitation). Voir fonction SetEnvironmentVariable .
Source limitation de chaîne de ligne de commande d'invite de commande (Cmd.exe)