विंडोज के पास पर्यावरण चर पर एक सीमा क्यों है?


10

1024 वर्ण सीमा के लिए तकनीकी कारण क्या है

पिछले 3 वर्षों से लिनक्स का उपयोग करने के बाद, कई विंडोज 7 प्रो मुद्दे मुझे मेरे दिन के काम में परेशान कर रहे हैं। सबसे अधिक अनाम फ़ाइल नाम सीमा और पर्यावरण चर भूल रहे हैं । मुझे पता है कि MSDN संयुक्त सिस्टम ENV के लिए सीमा 1024 है, लेकिन क्यों? मेरे पास एक बड़ा उपयोगकर्ता पथ चर सेट है। यह ठीक काम करता है, जब तक कि मैं इसे थोड़ी देर के लिए नहीं छोड़ता। तब अचानक यह पैठ मान को पहचानना बंद कर देगा जब तक मैं पुनः आरंभ नहीं करता।

विंडोज़ ईएनवी मूल्यों को कैसे संग्रहीत करता है जो इस लगाए गए सीमा का कारण होगा? सामान्य उपयोग के माध्यम से वह मूल्य कैसे भ्रष्ट हो जाएगा?

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

अद्यतन पूर्णता के लिए, मैं उन स्थितियों का वर्णन करूँगा जिनका उल्लेख मैंने किया है। मैं सामान्य रूप से सिस्टम सेटिंग्स में पर्यावरण संवाद के माध्यम से उपयोगकर्ता Env पथ सेट करता हूं। Msbuild, vstest.console.exe, tf.exe जैसी चीजें जो मैं विकसित करते समय चलाता हूं। मैं लगभग विशेष रूप से ConEmu में PowerShell v4 का उपयोग करता हूं। कुछ घंटों के बाद, या एक दिन के बाद उन आदेशों को अचानक मान्यता के अनुसार प्रतिक्रिया देना बंद कर दिया जाएगा। Env संवाद या कमांड लाइन के माध्यम से वैलेट को रीसेट करना या बदलना, कार्यक्षमता को बहाल नहीं करेगा। हालांकि $ एनव: ईएटीएच: की गूंज सही मान दिखाएगी। संयम ही एकमात्र उपाय था जो मैंने पाया।


उपयोगकर्ता-परिभाषित पर्यावरण चर का अधिकतम आकार 32,767 वर्ण है। पर्यावरण ब्लॉक के आकार पर कोई तकनीकी सीमा नहीं है। हालांकि, ब्लॉक तक पहुंचने के लिए उपयोग किए जाने वाले तंत्र के आधार पर व्यावहारिक सीमाएं हैं। उदाहरण के लिए, एक बैच फ़ाइल एक चर सेट नहीं कर सकती है जो अधिकतम कमांड लाइन की लंबाई से अधिक है।
साइमन

Why does Windows have a limit on environment variables at all?क्या Linux और अन्य OSes की भी कोई सीमा नहीं है? आप अपने सिस्टम पर अधिकतम स्ट्रिंग की तुलना में लंबे समय तक कैसे स्टोर कर सकते हैं? परिमित पता बस और परिमित मेमोरी वाले कंप्यूटर की स्ट्रिंग की लंबाई की कोई सीमा नहीं हो सकती है?
फुल्विक

जवाबों:


26

1024 वर्ण सीमा के लिए तकनीकी कारण क्या है

आपके द्वारा संदर्भित सीमा 1024 बाइट्स नहीं है। जैसा कि लेख में बताया गया है कि एक बग था, जिसमें एक हॉटफ़िक्स उपलब्ध था।

लेख स्पष्ट रूप से कहता है कि CreateEnvironmentBlockफ़ंक्शन के लिए सीमा 2048 बाइट्स है ।

इसके अलावा बग विंडोज (XP और सर्वर 2003) के दो पुराने संस्करणों के लिए विशिष्ट था।

जब कोई अनुप्रयोग Microsoft Windows Server 2003-आधारित या Microsoft Windows XP- आधारित कंप्यूटर पर वातावरण चर को पुनः प्राप्त करने के लिए CreateEnvironmentBlock फ़ंक्शन को कॉल करता है, तो लौटाया गया पथ पर्यावरण चर 1,024 बाइट्स पर छोटा हो जाता है। यह व्यवहार तब भी होता है जब एक पर्यावरण चर का अधिकतम आकार 2,048 बाइट्स होता है। यह समस्या एप्लिकेशन को सही वातावरण चर प्राप्त करने से रोकती है।

स्रोत किसी Windows Server 2003-आधारित या Windows XP- आधारित कंप्यूटर पर 1,024 बाइट्स के लिए एक लौटाया गया पथ परिवेश चर काट दिया जाता है


तो क्या सीमा 2048 वर्ण है?

वास्तविक सीमा 32,760 अक्षर है। हालाँकि, आपको उस सैद्धांतिक अधिकतम अभ्यास की प्राप्ति की संभावना नहीं है।

  • एक बैच फ़ाइल को अधिकतम कमांड लाइन की लंबाई से विवश किया जाता है क्योंकि पर्यावरण चर को बैच प्रोसेसर की कमांड लाइन बफर में फिट होने की आवश्यकता होती है।

    Microsoft Windows XP या बाद में चलने वाले कंप्यूटरों पर, कमांड प्रॉम्प्ट पर उपयोग किए जा सकने वाले स्ट्रिंग की अधिकतम लंबाई 8191 वर्ण है।

    कमांड प्रॉम्प्ट किसी भी पर्यावरण चर को अनदेखा करता है जो मूल प्रक्रिया से विरासत में मिला है और 8191 वर्णों की अपनी सीमाओं से अधिक लंबा है।

  • पर्यावरण रजिस्ट्री कुंजी सेट करना उस कोड में 2048 वर्ण सीमा है जो रजिस्ट्री कुंजी को पार्स करता है और इसमें से एक पर्यावरण ब्लॉक बनाता है।

नीचे दिए गए सूत्र


PATHसामान्य उपयोग के माध्यम से वह मूल्य ( ) कैसे भ्रष्ट हो जाएगा?

जैसा कि बाद में समझाया गया है, यह तब हो सकता है जब सिस्टम PATHको 1920 वर्णों से अधिक समय तक संशोधित किया जाए।

ऐसा क्यों हो रहा है, इस पर सटीक निदान के लिए आपने अपने प्रश्न में पर्याप्त जानकारी नहीं दी है।


मेरे पास एक बड़ा उपयोगकर्ता PATHचर सेट है

PATHपर्यावरण चर पर एक विशिष्ट सीमा होती है ।

उपयोगकर्ता PATHचर को सिस्टम PATHचर के साथ सफलतापूर्वक विलय करने के लिए सिस्टम चर PATH<1920 वर्ण होना चाहिए।

पता चला कि विंडोज सर्वर 2003 पर, एक बार सिस्टम PATH 1920 वर्णों को पारित कर देता है, PATHतो प्रक्रिया PATHपरिवेश चर सेट करने के लिए उपयोगकर्ता पर्यावरण चर अब इसके साथ विलय नहीं किया जाता है , भले ही पूर्ण प्रणाली PATH(भले ही बड़ी) प्रक्रिया PATHचर में शामिल हो जाएगी ।

स्रोत क्या गूंज% PATH% केवल सिस्टम या उपयोगकर्ता चर का भी विस्तार करता है? डेविड हेफर्नन द्वारा उत्तर


किसी फ़ाइल पथ पर सीमाएँ क्या हैं?

अधिकतम पथ लंबाई सीमा

विंडोज एपीआई में (निम्नलिखित पैराग्राफ में चर्चा किए गए कुछ अपवादों के साथ), एक पथ की अधिकतम लंबाई MAX_PATH है, जिसे 260 वर्णों के रूप में परिभाषित किया गया है।

  • एक स्थानीय पथ को निम्न क्रम में संरचित किया गया है: ड्राइव लेटर, कोलन, बैकस्लैश, बैकस्लैश द्वारा अलग किए गए नाम घटक और एक समाप्ति नल वर्ण।

  • उदाहरण के लिए, ड्राइव D पर अधिकतम पथ वह है D:\some 256-character path string<NUL>जहां <NUL>वर्तमान सिस्टम कोडपेज के लिए अदृश्य समाप्ति अशक्त चरित्र का प्रतिनिधित्व करता है। (अक्षर < और >यहाँ दृश्य स्पष्टता के लिए उपयोग किया जाता है और एक मान्य पथ स्ट्रिंग का हिस्सा नहीं हो सकता है।)

    नोट: Windows I में फ़ाइल I / O फ़ंक्शन "/" को \ n "" \ n "" उपसर्ग के रूप में निम्न अनुभागों में विस्तृत रूप में उपयोग करते हुए छोड़कर, नाम को NT-शैली नाम में परिवर्तित करने के भाग के रूप में परिवर्तित करते हैं।

विंडोज एपीआई में कई कार्य हैं जिनमें 32,767 वर्णों की अधिकतम पथ लंबाई के लिए विस्तारित-लंबाई पथ की अनुमति देने के लिए यूनिकोड संस्करण भी हैं।

  • इस प्रकार का पथ बैकस्लैश द्वारा अलग किए गए घटकों से बना है, प्रत्येक फ़ंक्शन के lpMaximumComponentLengthपैरामीटर में दिए गए GetVolumeInformationमान तक (यह मान आमतौर पर 255 वर्ण है)। एक विस्तारित-लंबाई पथ निर्दिष्ट करने के लिए, "\?" उपसर्ग का उपयोग करें। उदाहरण के लिए, "\! \ D: \ बहुत लंबा रास्ता"।

नोट: 32,767 वर्णों का अधिकतम पथ अनुमानित है, क्योंकि "\ _" उपसर्ग को रन टाइम पर सिस्टम द्वारा लंबे स्ट्रिंग तक विस्तारित किया जा सकता है, और यह विस्तार कुल लंबाई पर लागू होता है।

स्रोत नामकरण फ़ाइलें, पथ और नाम स्थान


एक पर्यावरण चर की अधिकतम लंबाई क्या है?

एक पर्यावरण चर की सैद्धांतिक अधिकतम लंबाई लगभग 32,760 अक्षर है। हालाँकि, आपको उस सैद्धांतिक अधिकतम अभ्यास की प्राप्ति की संभावना नहीं है।

  • सभी पर्यावरण चर को एक एकल पर्यावरण ब्लॉक में एक साथ रहना चाहिए, जिसमें स्वयं की सीमा 32767 वर्ण है।

  • लेकिन यह गिनती सभी पर्यावरण चर नामों और मूल्यों पर योग है, इसलिए आप अनुमान लगा सकते हैं, उस सैद्धांतिक अधिकतम लंबाई को मारा है यदि आपने सभी पर्यावरण चर हटा दिए हैं और फिर एक्स नामक एक चर को वास्तव में विशाल 32,760-वर्ण मान के साथ सेट किया है।

  • व्यवहार में, निश्चित रूप से, आपको ब्लॉक में अन्य सभी चर के साथ पर्यावरण ब्लॉक को साझा करना होगा, इसलिए SetEnvironmentVariable32,760-वर्ण स्ट्रिंग के साथ आपकी यादृच्छिक कॉल सफल होने की संभावना नहीं है।

लेकिन यह आपकी केवल व्यावहारिक सीमा नहीं है।

  • यह इस बात पर भी निर्भर करता है कि आप चर को कैसे सेट कर रहे हैं; यानी, कोड जो आपके पर्यावरण-चर-सेटिंग तकनीक से गुजरता है इससे पहले कि वह SetEnvironmentVariableकॉल पर पहुंच जाए।

  • यदि आप बैच फ़ाइल का उपयोग कर रहे हैं, तो आप अधिकतम कमांड लाइन की लंबाई से विवश हैं क्योंकि पर्यावरण चर को बैच प्रोसेसर की कमांड लाइन बफर में फिट होने की आवश्यकता है।

  • दूसरी ओर, शायद आप पर्यावरण रजिस्ट्री कुंजी सेट कर रहे हैं, जिस स्थिति में आप उस कोड में 2048-वर्ण सीमा में चलते हैं जो रजिस्ट्री कुंजी को पार्स करता है और इसमें से एक पर्यावरण ब्लॉक बनाता है।

  • अंतःक्रियात्मक रूप से वातावरण चर सेट करने के लिए संवाद बॉक्स में एक सीमा भी है, जिसका संख्यात्मक मान मेरे सिर के ऊपर से पता करने के लिए नहीं होता है।

स्रोत पर्यावरण चर की अधिकतम लंबाई क्या है? रेमंड चेन (एक Microsoft कर्मचारी) द्वारा।


कमांड प्रॉम्प्ट ( Cmd.exe) कमांड-लाइन स्ट्रिंग लिमिटेशन

Microsoft Windows XP या बाद में चलने वाले कंप्यूटरों पर, कमांड प्रॉम्प्ट पर उपयोग किए जा सकने वाले स्ट्रिंग की अधिकतम लंबाई 8191 वर्ण है। Microsoft Windows 2000 या Windows NT 4.0 चलाने वाले कंप्यूटरों पर, कमांड प्रॉम्प्ट पर आपके द्वारा उपयोग किए जा सकने वाले स्ट्रिंग की अधिकतम लंबाई 2047 वर्ण है।

यह सीमा कमांड लाइन, व्यक्तिगत पर्यावरण चर (जैसे PATH चर) पर लागू होती है जो अन्य प्रक्रियाओं, और सभी पर्यावरण चर विस्तार से विरासत में मिली हैं। यदि आप बैच फ़ाइलों को चलाने के लिए कमांड प्रॉम्प्ट का उपयोग करते हैं, तो यह सीमा बैच फ़ाइल प्रसंस्करण पर भी लागू होती है।

उदाहरण

निम्न सूची आपको कुछ उदाहरण देती है कि यह सीमा कमांड प्रॉम्प्ट में चलने वाली कमांड पर कैसे लागू होती है और कमांड जो आप एक बैच फ़ाइल में उपयोग करते हैं।

  • कमांड प्रॉम्प्ट में, कमांड प्रॉम्प्ट पर आपके द्वारा उपयोग की जाने वाली निम्न कमांड लाइन की कुल लंबाई 2047 या 8191 अक्षर (आपके ऑपरेटिंग सिस्टम के लिए उपयुक्त) से अधिक नहीं हो सकती है:

    cmd.exe /k ExecutableFile.exe parameter1, parameter2 ... parameterN
    
  • बैच फ़ाइल में, निम्न कमांड लाइन की कुल लंबाई जो आप बैच फ़ाइल में उपयोग करते हैं, उसमें 2047 या 8191 अक्षर (आपके ऑपरेटिंग सिस्टम के लिए उपयुक्त) से अधिक नहीं हो सकते हैं:

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

    जब आप बैच फ़ाइल को चलाने के लिए कमांड प्रॉम्प्ट का उपयोग करते हैं तो यह सीमा कमांड लाइनों पर लागू होती है जो बैच फ़ाइलों में समाहित होती है।

  • कमांड प्रॉम्प्ट में, एन्वायरमेंटल वेरिएबल 1 और एनवायरमेंटल वेरिएबल 3 का विस्तार करने के बाद एन्वायरमेंटल वेरिएबल 1 की कुल लंबाई 2047 या 8191 कैरेक्टर (आपके ऑपरेटिंग सिस्टम के लिए उपयुक्त) से अधिक नहीं हो सकती है:

    c:> set EnvironmentVariable1=EnvironmentVariable2EnvironmentVariable3
    
  • एक बैच फ़ाइल में, कमांड लाइन में पर्यावरण चर का विस्तार करने के बाद निम्न कमांड लाइन की कुल लंबाई 2047 या 8191 अक्षर (आपके ऑपरेटिंग सिस्टम के लिए उपयुक्त) से अधिक नहीं हो सकती है:

    ExecutableFile.exe parameter1 parameter2
    
  • भले ही पर्यावरण चर के लिए Win32 सीमा 32,767 अक्षर है, कमांड प्रॉम्प्ट किसी भी पर्यावरण चर को अनदेखा करता है जो मूल प्रक्रिया से विरासत में मिला है और 2047 या 8191 वर्ण (ऑपरेटिंग सिस्टम के लिए उपयुक्त) की अपनी सीमाओं से अधिक लंबा है। SetEnvironmentVariable फ़ंक्शन देखें ।

स्रोत कमांड प्रॉम्प्ट (Cmd.exe) कमांड-लाइन स्ट्रिंग सीमा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.