web-dev-qa-db-fra.com

Pourquoi Windows a-t-il une limite sur les variables d'environnement?

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.

8
DouglasCodes

Quelles sont les raisons techniques pour la limite de 1024 caractères

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.

Source ne variable d'environnement de chemin d'accès retournée est tronquée à 1 024 octets sur un ordinateur Windows Server 2003 ou Windows XP


La limite est-elle de 2048 caractères?

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.


Comment cette valeur (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.


J'ai un ensemble de variables utilisateur PATH de grande taille

Il 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 processus PATH, même si le système complet PATH (même s'il est plus volumineux) sera inclus dans la variable de processus PATH.

Source echo% PATH% s'étend-t-il uniquement au système ou également aux variables utilisateur? répondez par David Heffernan


Quelles sont les limites d'un chemin de fichier?

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 fonction GetVolumeInformation (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


Quelle est la longueur maximale d'une variable d'environnement?

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).


Invite de commandes (Cmd.exe) limitation de chaîne de ligne de commande

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. 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)

23
DavidPostill