Warum sind Umgebungsvariablen in Windows überhaupt begrenzt?

7

Was sind die technischen Gründe für die Beschränkung auf 1024 Zeichen?

Nachdem ich in den letzten 3 Jahren Linux verwendet habe, haben mich so viele Probleme mit Windows 7 Pro bei meiner täglichen Arbeit beschäftigt. Die verrücktesten sind das Dateinamenlimit und die Umgebungsvariable vergessen . Ich weiß, dass laut MSDN die Beschränkung für das kombinierte System ENV 1024 beträgt, aber warum? Ich habe eine große Benutzerpfadvariable festgelegt. Es funktioniert gut, es sei denn, ich lasse es für eine Weile auf. Dann hört es plötzlich auf, den PATH-Wert zu erkennen, bis ich neu starte.

Wie speichert Windows die ENV-Werte, die diese auferlegte Grenze verursachen würden? Wie würde dieser Wert durch normalen Gebrauch verfälscht?

MSDN https://support.microsoft.com/en-us/kb/906469

Aktualisieren Der Vollständigkeit halber beschreibe ich die Situationen, in denen das erwähnte Problem auftritt. Normalerweise stelle ich User Env PATH über den Umgebungsdialog in den Systemeinstellungen ein. Dinge wie msbuild, vstest.console.exe, tf.exe, die ich während der Entwicklung ausgeführt habe. In ConEmu verwende ich fast ausschließlich PowerShell v4. Nach ein paar Stunden oder einem Tag Betriebszeit reagieren diese Befehle plötzlich nicht mehr als erkannt. Durch Zurücksetzen oder Ändern der Werte über den Env-Dialog oder die Befehlszeile wird die Funktionalität nicht wiederhergestellt. Wenn Sie $ env: PATH wiederholen, werden die korrekten Werte angezeigt. Neustart war die einzige Lösung, die ich gefunden habe.

DouglasCodes
quelle
Die maximale Größe einer benutzerdefinierten Umgebungsvariablen beträgt 32.767 Zeichen. Es gibt keine technische Beschränkung für die Größe des Umgebungsblocks. Abhängig von dem Mechanismus, der für den Zugriff auf den Block verwendet wird, gibt es jedoch praktische Grenzen. Beispielsweise kann eine Batchdatei keine Variable festlegen, die länger als die maximale Befehlszeilenlänge ist.
SimonS
Why does Windows have a limit on environment variables at all? Haben Linux und andere Betriebssysteme keine Grenzen? Wie können Sie eine Zeichenfolge länger als die maximale Zeichenfolge speichern, die Sie auf Ihrem System haben können? Wie kann ein Computer mit endlichem Adressbus und endlichem Speicher die String-Länge unbegrenzt lassen?
phuclv

Antworten:

21

Was sind die technischen Gründe für die Beschränkung auf 1024 Zeichen?

Das Limit, auf das Sie sich beziehen, ist nicht 1024 Byte. Wie in dem von Ihnen verlinkten Artikel erläutert, handelte es sich um einen Fehler, für den ein Hotfix verfügbar war.

Der Artikel sagt ausdrücklich, dass das Limit 2048 Bytes beträgt für die CreateEnvironmentBlock Funktion .

Darüber hinaus betraf der Fehler zwei alte Windows-Versionen (XP und Server 2003).

Wenn eine Anwendung die CreateEnvironmentBlock-Funktion aufruft, um die Umgebungsvariablen auf einem Microsoft Windows Server 2003- oder Microsoft Windows XP-Computer abzurufen, wird die zurückgegebene Pfadumgebungsvariable auf 1.024 Byte gekürzt. Dieses Verhalten tritt auf, obwohl die maximale Größe einer Umgebungsvariablen 2.048 Byte beträgt. Dieses Problem verhindert, dass die Anwendung die richtige Umgebungsvariable abruft.

Quelle Eine zurückgegebene Pfadumgebungsvariable wird auf einem Windows Server 2003- oder Windows XP-Computer auf 1.024 Byte gekürzt


Ist das Limit also 2048 Zeichen?

Das tatsächliche Limit beträgt 32.760 Zeichen. Es ist jedoch unwahrscheinlich, dass Sie dieses theoretische Maximum in der Praxis erreichen.

  • Eine Batchdatei ist durch die maximale Befehlszeilenlänge beschränkt, da die Umgebungsvariable in den Befehlszeilenpuffer des Batchprozessors passen muss.

    Auf Computern mit Microsoft Windows XP oder höher beträgt die maximale Länge der Zeichenfolge, die Sie an der Eingabeaufforderung verwenden können, 8191 Zeichen.

    Die Eingabeaufforderung ignoriert alle Umgebungsvariablen, die vom übergeordneten Prozess geerbt wurden und länger sind als die eigenen Beschränkungen von 8191 Zeichen.

  • Das Festlegen des Umgebungsregistrierungsschlüssels hat ein Zeichenlimit von 2048 im Code, der diesen Registrierungsschlüssel analysiert und daraus einen Umgebungsblock erstellt es.

Quellen unten dokumentiert.


Wie würde dieser Wert ( PATH ) durch normalen Gebrauch verfälscht werden?

Wie später erläutert, kann dies beim System vorkommen PATH wird geändert, um länger als 1920 Zeichen zu sein.

Sie haben in Ihrer Frage nicht genügend Informationen angegeben, um genau zu diagnostizieren, warum dies geschieht.


Ich habe einen großen Benutzer PATH Variablensatz

Es gibt eine bestimmte Grenze für die PATH Umgebungsvariable.

Damit für den Benutzer PATH Variable, die erfolgreich mit dem System zusammengeführt werden soll PATH Variable das System PATH Variable muss & lt; 1920 Zeichen.

Fand heraus, dass der Benutzer unter Windows Server 2003 1920 Zeichen übergibt, sobald der Systempfad übergeben wurde PATH Die Umgebungsvariable wird nicht mehr mit ihr zusammengeführt, um den Prozess festzulegen PATH Umgebungsvariable, obwohl das gesamte System PATH (auch wenn größer) wird in den Prozess einbezogen PATH Variable.

Quelle Wird echo% PATH% nur auf das System oder auch auf die Benutzervariablen ausgeweitet? Antwort per David Heffernan


Was sind die Grenzen für einen Dateipfad?

Maximale Pfadlängenbegrenzung

In der Windows-API (mit einigen Ausnahmen, die im Folgenden erläutert werden)   Absätze) ist die maximale Länge für einen Pfad MAX_PATH   definiert als 260 Zeichen.

  • Ein lokaler Pfad ist in der folgenden Reihenfolge strukturiert: Laufwerkbuchstabe, Doppelpunkt, umgekehrter Schrägstrich, durch umgekehrte Schrägstriche getrennte Namenskomponenten und a   Nullzeichen beenden.

  • Beispielsweise ist der maximale Pfad auf Laufwerk D D:\some 256-character path string<NUL> woher <NUL> repräsentiert die unsichtbare Terminierung   Nullzeichen für die aktuelle System-Codepage. (Die Charaktere < und > dienen hier der visuellen Klarheit und können nicht Teil einer gültigen sein   Pfadzeichenfolge.)

    Hinweis: Datei-E / A-Funktionen in der Windows-API konvertieren "/" nach "\" als   Teil der Konvertierung des Namens in einen Namen im NT-Stil, außer bei Verwendung der   "\? \" Präfix, wie in den folgenden Abschnitten beschrieben.

Die Windows-API verfügt über viele Funktionen, die auch Unicode-Versionen enthalten   Erlaube einen längeren Pfad für eine maximale Gesamtpfadlänge von   32.767 Zeichen.

  • Dieser Pfadtyp setzt sich aus durch Backslashes getrennten Komponenten zusammen, die jeweils bis zu dem in der zurückgegebenen Wert reichen lpMaximumComponentLength Parameter der GetVolumeInformation function (dieser Wert besteht normalerweise aus 255 Zeichen). Angeben eines   Verwenden Sie für Pfade mit erweiterter Länge das Präfix "\? \". Zum Beispiel "\? \ D: \ very   langer Weg ".

Hinweis: Der maximale Pfad von 32.767 Zeichen ist ungefähr, weil   Das Präfix "\? \" kann vom System unter zu einer längeren Zeichenfolge erweitert werden   Laufzeit, und diese Erweiterung gilt für die Gesamtlänge.

Quelle Benennen von Dateien, Pfaden und Namespaces


Was ist die maximale Länge einer Umgebungsvariablen?

Die theoretische maximale Länge einer Umgebungsvariablen beträgt ca. 32.760 Zeichen. Es ist jedoch unwahrscheinlich, dass Sie dieses theoretische Maximum in der Praxis erreichen.

  • Alle Umgebungsvariablen müssen in einem einzigen Umgebungsblock zusammenleben, der selbst eine Begrenzung von 32767 Zeichen aufweist.

  • Diese Anzahl ist jedoch die Summe aller Umgebungsvariablennamen und -werte. Sie könnten also, denke ich, diese theoretische maximale Länge erreichen, wenn   Sie haben alle Umgebungsvariablen gelöscht und dann eine einzige festgelegt   Variable mit dem Namen X und einem wirklich riesigen Wert von 32.760 Zeichen.

  • In der Praxis müssen Sie natürlich den Umgebungsblock mit allen anderen Variablen im Block teilen, damit Sie Ihren zufälligen Aufruf an SetEnvironmentVariable mit einer 32.760-Zeichenfolge ist das unwahrscheinlich   gelingen.

Dies ist jedoch nicht Ihre einzige praktische Grenze.

  • Dies hängt auch davon ab, wie Sie die Variable einstellen. d.h. der Code, den Ihre Technik zum Festlegen von Umgebungsvariablen zuvor durchlaufen hat   es kommt zum SetEnvironmentVariable Anruf.

  • Wenn Sie eine Stapeldatei verwenden, ist die maximale Befehlszeilenlänge begrenzt, da die Umgebungsvariable angepasst werden muss   der Kommandozeilenpuffer des Batch-Prozessors.

  • Andererseits legen Sie möglicherweise den Registrierungsschlüssel "Environment" fest. In diesem Fall ist der Code auf 2048 Zeichen beschränkt   Dadurch wird dieser Registrierungsschlüssel analysiert und ein Umgebungsblock daraus erstellt   es.

  • Es gibt auch eine Einschränkung im Dialogfeld zum interaktiven Festlegen von Umgebungsvariablen, deren numerischer Wert ich nicht habe   zufällig aus dem Kopf wissen.

Quelle Was ist die maximale Länge einer Umgebungsvariablen? von Raymond Chen (ein Microsoft-Mitarbeiter).


Eingabeaufforderung ( Cmd.exe ) Einschränkung der Befehlszeilenzeichenfolge

Auf Computern mit Microsoft Windows XP oder höher beträgt die maximale Länge der Zeichenfolge, die Sie an der Eingabeaufforderung verwenden können, 8191 Zeichen. Auf Computern unter Microsoft Windows 2000 oder Windows NT 4.0 beträgt die maximale Länge der Zeichenfolge, die Sie an der Eingabeaufforderung verwenden können, 2047 Zeichen.

Diese Einschränkung gilt für die Befehlszeile, einzelne Umgebungsvariablen (z. B. die Variable PATH), die von anderen Prozessen geerbt werden, und alle Erweiterungen von Umgebungsvariablen. Wenn Sie zum Ausführen von Batchdateien die Eingabeaufforderung verwenden, gilt diese Einschränkung auch für die Verarbeitung von Batchdateien.

Beispiele

Die folgende Liste enthält einige Beispiele dafür, wie diese Einschränkung auf Befehle angewendet wird, die Sie in der Eingabeaufforderung ausführen, sowie auf Befehle, die Sie in einer Batchdatei verwenden.

  • In der Eingabeaufforderung darf die Gesamtlänge der folgenden Befehlszeile, die Sie an der Eingabeaufforderung verwenden, nicht mehr als beides enthalten   2047 oder 8191 Zeichen (je nach Betriebssystem):

    cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
    
  • In einer Batchdatei darf die Gesamtlänge der folgenden Befehlszeile, die Sie in der Batchdatei verwenden, nicht mehr als 2047 oder 8191 enthalten   Zeichen (je nach Betriebssystem):

    cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
    

    Diese Einschränkung gilt für Befehlszeilen, die im Batch enthalten sind   Dateien, wenn Sie die Eingabeaufforderung verwenden, um die Batchdatei auszuführen.

  • In der Eingabeaufforderung kann die Gesamtlänge von EnvironmentVariable1 nach dem Erweitern von EnvironmentVariable2 und EnvironmentVariable3 nicht angegeben werden   Enthält mehr als 2047 oder 8191 Zeichen (je nach Bedarf)   Ihr Betriebssystem):

    c:> set EnvironmentVariable1=EnvironmentVariable2EnvironmentVariable3
    
  • In einer Batchdatei kann die Gesamtlänge der folgenden Befehlszeile nach dem Erweitern der Umgebungsvariablen in der Befehlszeile nicht   Enthält mehr als 2047 oder 8191 Zeichen (je nach Bedarf)   Ihr Betriebssystem):

    ExecutableFile.exe parameter1 parameter2
    
  • Obwohl die Win32-Beschränkung für Umgebungsvariablen 32.767 Zeichen beträgt, ignoriert die Eingabeaufforderung alle Umgebungsvariablen   Diese werden vom übergeordneten Prozess geerbt und sind länger als der eigene   Einschränkungen von entweder 2047 oder 8191 Zeichen (je nach   Betriebssystem). Sehen SetEnvironmentVariable-Funktion .

Quelle Beschränkung der Befehlszeilenzeichenfolge für die Eingabeaufforderung (Cmd.exe)

DavidPostill
quelle
Vielen Dank für Ihre ausführliche Antwort. Ich erkannte, dass die Quelle nicht für Windows 7 war, aber es war die am häufigsten gefundene Referenz mit Details. Ich war weniger an einer Lösung interessiert, da es sich offenbar um eine bekannte Einschränkung handelte. Am Ende habe ich viele der Befehle mit längeren Pfaden als Alias ​​verwendet. Mich hat mehr interessiert, wie Windows mit denen umgeht, die Sie beantworten konnten.
DouglasCodes