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


44

मेरे सहकर्मी और मेरे पास Windows XP Professional x64 संस्करण के साथ समान डेल वर्कस्टेशन हैं।

मेरा पथ पर्यावरण चर के साथ शुरू होता है:

%JAVA_HOME%\bin;...

मेरे सहकर्मी के पथ चर में वही निर्देशिका शामिल है, जो समान पर्यावरण चर का उपयोग करके निर्दिष्ट की गई है, लेकिन यह उसके पथ का पहला आइटम नहीं है।

यदि मैं सिस्टम गुण -> पर्यावरण चर का उपयोग करता हूं और मेरे JAVA_HOME चर का मान बदलता है, तो जावा का संस्करण कमांड-लाइन से पाया जाता है जैसा कि मुझे उम्मीद है। यह एक नया कंसोल विंडो शुरू कर रहा है, बदलावों को सुनिश्चित करने के लिए।

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

मैं अब लगभग 6 महीने से विंडोज पर इस असंगति को देख रहा हूं और इसके बारे में बहुत उत्सुक हूं। हमारे कार्यालय में विंडोज के कई संस्करण हैं, इसलिए शायद ही मुझे अब तक एक ही ओएस संस्करण को चलाने वाली दो मशीनों पर ऐसा होता देखने का मौका मिला है।

इसके उत्पन्न होने का कारण क्या है? जब मेरा करता है, तो उसका यंत्र नए JAVA_HOME का उपयोग करते हुए पथ का पुनर्मूल्यांकन क्यों नहीं करता है?

(क्या यह इसलिए है क्योंकि यह पथ में पहली चीज नहीं है? यदि हां, तो यह कैसे हो सकता है, और क्यों? मैं जांच करने के लिए और परीक्षण करूंगा, लेकिन मुझे लगता है कि वह अब इससे तंग आ चुका है और काम पर वापस जाना चाहता है ।)


9
आप सभी लोगों को वोट करने के लिए (फिलहाल में 3) ... अगर कहीं पर कोई डुप्लिकेट है, तो एक टिप्पणी जो मुझे यह इंगित करती है कि यह अच्छा होगा। यदि यह कोई धोखा नहीं है ... तो मुझे बताएं कि आप इस प्रश्न के बारे में क्या सोचते हैं यह भी अच्छा होगा।
स्किप्होपी

1
शायद इसलिए कि यह एक प्रोग्रामिंग की तुलना में अधिक प्रणाली का प्रश्न है, हालांकि इसका प्रोग्रामिंग पर सीधा प्रभाव पड़ता है, इसीलिए मैं इसे बंद करने के लिए वोट नहीं देता ... :)

9
एटनियन क्लोज़-नाज़िस: मैं इस विचार को बढ़ावा देना चाहूंगा कि अगर सुपरसर्ज़.कॉम और सर्वरफॉल्ट.कॉम के आने से पहले स्टैक ओवरफ़्लो पर एक सवाल उचित था, तो यह आज भी उचित है। यह एक प्रोग्रामिंग सवाल है।
स्किप्पॉपी

क्या आपका मतलब है कि प्रोग्रामर केवल विंडोज के उपयोगकर्ता हैं, जिन्हें यह समस्या हो सकती है? चुप रहो, प्रोग्रामर-नाज़ी! दूसरे, अधिक उपयुक्त Q & A साइट आने से पहले, आपके पास यहाँ प्रश्न पोस्ट करने का कोई विकल्प नहीं था। एसओ के आतिथ्य का दुरुपयोग करने के लिए एक तर्क नहीं होना चाहिए।
वैल

मैं इसे विंडोज 10 में देख रहा हूं - PATH में परिवर्तनीय प्रतिस्थापन कार्य करने के लिए रुक-रुक कर विफल रहा । पर्यावरण चर और बचत (परिवर्तन के बिना) पर जाना और फिर एक नया सीएमडी शीघ्र खोलने से समस्या हल हो गई।
थॉमस डब्ल्यू

जवाबों:


37

आपका पथ उपयोगकर्ता पथ के बाद सिस्टम पथ का संघटन है। इसके अतिरिक्त, सिस्टम परिवेश चर में उपयोगकर्ता परिवेश चर का संदर्भ नहीं हो सकता है , और ऐसे किसी भी संदर्भ का विस्तार नहीं किया जाएगा। वांछित परिणाम प्राप्त करने के लिए, उपयोगकर्ता परिवेश चर PATH में% JAVA_HOME% का संदर्भ डालें , या ऐसा वैरिएबल बनाएं यदि यह पहले से मौजूद नहीं है।

शायद एक सरलीकृत उदाहरण यह स्पष्ट कर देगा। मान लीजिए कि सिस्टम वातावरण है

ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32

और उपयोगकर्ता जेस्मिथ का वातावरण है

JAVA_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %JAVA_HOME%\bin;%USERPROFILE%\bin

तब परिणामी रास्ता होगा

C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin

जैसी इच्छा।


3
मेरे सिस्टम में कुछ यूजर एनवी वैरिएबल थे जिनके नाम कुछ सिस्टम एनव वैरिएबल्स के समान थे। Echoing PATH उन्हें विस्तारित नहीं करेगा - इसे पढ़ने के बाद, मैंने डुप्लिकेट उपयोगकर्ता चर हटा दिए क्योंकि मुझे आश्चर्य हुआ कि क्या वे पूर्वता के साथ उठाए गए थे (लेकिन विस्तारित होने में असमर्थ)। यह अब मेरे लिए काम कर रहा है - बहुत धन्यवाद। :)
माइकल

क्या मूल अनिर्धारित PATH प्राप्त करने के लिए Powershell के माध्यम से एक रास्ता है? मैं इसमें अनपेक्षित वातावरण चर को संरक्षित करते हुए अपने पेटीएम के लिए अपील करने की उम्मीद कर रहा था।
CMCDragonkai 14:23

एक और सवाल से कुछ मदद के साथ इसे हल किया। इसे संभालने के लिए एक पॉवरशेल
CMCDragonkai

16

इस कुंजी के तहत विंडोज रजिस्ट्री में जाँच करें:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment

यदि पर्यावरण चर का विस्तार किया जाना है (यहाँ:% JAVA_HOME%)

तब चर को REG_EXPAND_SZ मान के रूप में सेट किया जाना चाहिए ।

यदि रजिस्ट्री मान जोड़ने / संपादित करने के लिए कमांड-लाइन के माध्यम से reg.exe का उपयोग किया जाता है, तो यह REG_SZ टाइप करने के लिए चूक करता है। reg add /t REG_EXPAND_SZविकल्प का उपयोग करके REG_EXPAND_SZ टाइप करें ।


हाँ ... यह उन सेटिंग्स में से एक है जो मुझे हमेशा भूलने लगती हैं ... pesky रजिस्ट्री ;-)
एडी बी

9

PATH चर के भीतर पर्यावरण चर के विस्तार के साथ एक निश्चित समस्या है जब चर एक पथ में फैलता है जिसमें रिक्त स्थान होते हैं।

हमने "Our_ROOT = c: \ MyRoot" जैसे अपने स्वयं के सिस्टम स्तर चर बनाए और फिर इसे "PATH =;% Our_ROOT% \ बिन;" और जो "PATH =; c: \ MyRoot \ bin;" में सही तरीके से विस्तारित हो जाता है। अब तक कोई समस्या नहीं।

लेकिन, विंडोज 7 (32-बिट) पर, मेरे पास एक उत्पाद खुद को स्थापित करने और इस तरह के सिस्टम वातावरण चर बनाने के लिए था:

STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin

और इसे सिस्टम PATH चर में जोड़ा गया:

PATH=<other path elements>;%STUDIO_BIN%;<more path elements>

लेकिन CMD में दिखाए गए PATH मानों में "% STUDIO_BIN%;" और विस्तारित पथ नहीं। मेरा कंप्यूटर में गुण> गुण> उन्नत> Env.Vars के रूप में अच्छी तरह से unexpanded बने रहे। इसका मतलब है कि मैं उस निर्देशिका में DLL के लिए आवश्यक प्रोग्राम नहीं चला सकता था।

केवल एम्बेडेड स्थानों के बिना एक नाम के लिए STUDIO_BIN (मेरे कंप्यूटर के माध्यम से> उन्नत ...> Env Vars) को बदलकर:

STUDIO_BIN=C:\ProductName\bin

और फिर CMD विंडो को फिर से शुरू करना, PATH अब है:

PATH=<other path elements>;C:\ProductName\bin;<more path elements>

एक अन्य उपाय यह है कि आप PATH में जो सिस्टम वैरिएबल का उपयोग कर रहे हैं, उसे My Computer> Properties> Advanced ...> एन्वायर्नमेंट वॅरीटेबल्स संवाद का उपयोग करके पर्याप्त रूप से संपादित करें। मैंने एक चरित्र जोड़ने और इसे 'परिवर्तन' बनाने के लिए हटाने की कोशिश की और फिर ठीक हो गया, एक नया सीएमडी प्रॉम्प्ट शुरू किया और पैठ को सही ढंग से विस्तारित नहीं किया गया। मैंने तब पथ के हिस्से को हटाने की कोशिश की थी इसलिए यह था

STUDIO_BIN=C:\Program Files\Company Name

("उत्पाद का नाम 10.4" को छोड़ते हुए) और लो, और निहारना, अगले CMD प्रॉम्प्ट ने PATH को STUDIO_BIN के साथ ठीक से विस्तारित दिखाया!

अजीब तरह से, अगर मैं वापस चला गया और STUDIO_BIN में "उत्पाद का नाम 10.4" जोड़ दिया (मूल रूप से सभी जगह जो मूल रूप से इससे पहले कि मैं इसके साथ मिलाना शुरू कर दिया था) और पाथ को अभी भी सही ढंग से विस्तारित किया गया था।

अपनी सामग्री में पर्याप्त परिवर्तन के साथ, पर्यावरण चर डायलॉग में कुछ अतिरिक्त प्रसंस्करण से गुजरता है जो इसे काम करने की अनुमति देता है। प्रसंस्करण जो उत्पाद के इंस्टॉलर द्वारा चर जोड़ा गया था (जो शायद रजिस्ट्री में सीधे पैट को संशोधित करता है) नहीं किया गया है।

मैं लगभग सकारात्मक हूँ यह XP के साथ एक समस्या थी। यह सिर्फ विंडोज 7 में मेरे लिए पुनर्जीवित हुआ क्योंकि मैं एक नई विकास मशीन को एक साथ रख रहा था। स्पष्ट रूप से यह Microsoft द्वारा तय नहीं किया गया है।

जाहिरा तौर पर भी MS ProgramFiles% जैसे MS परिभाषित चर पथ में सही ढंग से विस्तार नहीं करेंगे।

यदि आप PATH को कमांड-लाइन या बैच फ़ाइल के माध्यम से सेट कर रहे हैं तो यह पृष्ठ एक संभावित उत्तर प्रदान करता है। (उद्धरण चिह्नों में SET के बाद पूरे कमांड को शामिल करें।) मुझे नहीं पता कि मैंने पर्यावरण के चर सेट करने के लिए किस उत्पाद को इंस्टाल किया, लेकिन यह स्पष्ट रूप से रिक्त स्थान के साथ रास्तों का विस्तार करने के लिए जो भी प्रसंस्करण की आवश्यकता है उसके आसपास चला गया।

तो - संक्षेप में, आप या तो कर सकते हैं:

  • रिक्त स्थान के बिना पथों के पथों को बदलें (और सभी संबद्ध फ़ाइलों को स्थानांतरित करें), या

  • पर्यावरण चर संवाद में विस्तार करने में विफल रहे चर को संपादित करें (उन्हें सही ढंग से संसाधित करने के लिए उन्हें पर्याप्त रूप से बदलना - मैं सकारात्मक नहीं हूं कि कितना पर्याप्त है)।


7

मैंने मार्च 2009 में Microsoft मंचों पर यह पूछा, और इसे कभी हल नहीं किया:

पथ परिवेश चर में% ProgramFiles% का उपयोग कैसे करें? :


मैं सिस्टम के पथ वातावरण चर में एक फ़ोल्डर जोड़ने की कोशिश कर रहा हूं।

मैं % ProgramFiles% \ SysInternals जोड़ना चाहता हूं

मौजूदा पथ चर के लिए:

C: \ कार्यक्रम ~ 1 \ बोर्लेन्ड \ Delphi5 \ परियोजनाओं \ बीपीएल, C: \ कार्यक्रम ~ 1 \ बोर्लेन्ड \ Delphi5 \ बिन; % SystemRoot% \ system32; % SystemRoot% ;% SystemRoot % \ System32 \ Wbem; C: \ Program Files \ Microsoft SQL Server \ 80 \ Tools \ BINN; C: \ Program Files \ Microsoft SQL Server \ 80 \ Tools \ Binn \; C; \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ binn \; C: \ Program Files \ Microsoft SQL Server \ 90 \ DTS's Binn \; C: \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Binn \ VSShell \ Common7 / IDE \; C: \ Program Files \ Microsoft Visual Studio 8 \ Common7 \ IDE \ PrivateAssemblies \;% SYSTEMROOT % \ System32 \ WindowsPowerShell \ v1.0 \

इसलिए मैं उस जगह पर जाता हूं जहां आप इसे संपादित करते हैं:

वैकल्पिक शब्द

और मैं मार्ग में अपना चर जोड़ता हूं:

% ProgramFiles % \ (स्निप)

फिर एक नई कमांड प्रॉम्प्ट विंडो खोलना पर्यावरण चर को वास्तविक मान से प्रतिस्थापित नहीं किया जाता है:

पथ =% ProgramFiles % \ SysInternals; C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projects \ Bpl (स्निप)>

जिसे आप निम्नलिखित स्क्रीनशॉट में देख सकते हैं:

वैकल्पिक शब्द


लेकिन आपके सवाल का जवाब देने के लिए: मुझे नहीं पता। ऐसा लगता है कि यह नहीं किया जा सकता है।


5

पर्यावरण चर, वैश्विक और उपयोगकर्ता के दो स्तर हैं। यदि उसके पास उपयोगकर्ता वातावरण चर के रूप में% Java_home% सेट है, लेकिन इसके बजाय वह वैश्विक परिवर्तन कर रहा है, तो उसे कोई अंतर नहीं दिखेगा।


2

सुनिश्चित करें कि जब आप अपने स्वयं के उपयोगकर्ता पर्यावरण चर को परिभाषित कर रहे हैं तो पेट में कोई जगह नहीं है। उदाहरण: C: \ GNAT \ bin; C: \ GNAT \ "के बीच की जगह के कारण अभ्यस्त कार्य शामिल हैं;" और "C: \ GNAT \" शामिल हैं।


2

MSTSC का उपयोग कर / कंसोल सत्र पर लॉग किए गए परिवेश चर जोड़ें।

मशीन को रिबूट करें और आप पाएंगे कि आपके पर्यावरण चर लगातार बने रहेंगे।

जब आप पर्यावरण चर को बदलने का प्रयास करते हैं, तो आप मशीन से कैसे जुड़े थे, इस पर निर्भर करते हुए, ओ / एस में एक विचित्र प्रतीत होता है।


1

यह "विलंबित पर्यावरण चर विस्तार" सुविधा (या इसके अभाव) से संबंधित हो सकता है, या शायद आप हमेशा सही समाधान के लिए इस सुविधा का लाभ उठा सकते हैं।

एक cmd प्रॉम्प्ट से

set /? 

और "विलंबित पर्यावरण चर विस्तार" का वर्णन करने वाला अनुभाग पढ़ें, जिसमें परीक्षण करने के लिए एक छोटा उदाहरण शामिल है

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

यदि आपको प्रतिध्वनि रेखा नहीं मिलती है, तो वह इसे समझा सकता है ...

यदि, हालांकि, आप अपने cmd.exe को / V विकल्प के साथ शुरू करते हैं, तो आप "" का उपयोग कर सकते हैं! "%" के बजाय, जो व्यवहार को बदलता है

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

मेरे लिए (XP पर चल रहा है), 1 स्क्रिप्ट ने काम नहीं किया, लेकिन दूसरे संस्करण ने (cmd.exe / V के साथ) किया


1

मेरे पास एक ही समस्या है, और मुझे पता है कि इसे कैसे ठीक करना है, इसकी लंगड़ी।

बस अपने पैट को फिर से संपादित करें, लेकिन कोई बदलाव न करें, और पैट को फिर से सहेजें। किसी कारण से यह सभी नेस्टेड वातावरण चर संदर्भों का पुनर्मूल्यांकन करने का कारण बनता है।

यदि यह काम नहीं करता है तो इसे कुछ और बार करें, किसी भी तरह यह सिर्फ खुद ही काम करता है।


1

मुझे विश्वास है कि विंडोज PATH में एक चर का विस्तार करने में विफल रहता है क्योंकि यह सोचता है कि यह अभी तक परिभाषित नहीं है। विचार करें:

REM Ensure variable is undefined
SET UNDEFINED=
REM And then try to expand it
ECHO UNDEFINED=%UNDEFINED%

यह परिकल्पना मेरे अन्य अवलोकन के अनुरूप है - उपयोगकर्ताओं को जोड़ने %ProgramFiles%\Somethingसे हमेशा अपेक्षित विस्तार होगा , क्योंकि यह परिवर्तन चर अधिसूचना (लोडिंग ऑर्डर - MACHINE और फिर USER) के समय मशीन वातावरण में परिभाषित किया गया है। लेकिन जब आप मशीन वातावरण को संशोधित करते हैं तो सही चर विस्तार केवल बूट समय पर होता है (अभी मुझे पता नहीं है कि यह नियमित रूप से कैसे और क्यों नहीं होता है)। PATH%ProgramFiles%


1

आपको उस आदेश पर विचार करना होगा जिसमें लॉगिन पर चर निर्धारित किए जाते हैं। यदि आप सेट होने से पहले एक चर का उपयोग करने का प्रयास करते हैं, तो यह खाली स्ट्रिंग के रूप में सामने आएगा।

प्रभावी PATH उपयोगकर्ता का PATH वैरिएबल का परिवर्तन है, जिसके बाद ग्लोबल PATH वैरिएबल आता है।

उपयोगकर्ता चर वैश्विक चर से पहले सेट किए जाते हैं, इसलिए आप उपयोगकर्ता चर में वैश्विक चर का उपयोग नहीं कर सकते। इसके अतिरिक्त, चर वर्णमाला क्रम में सेट किए जाते हैं, इसलिए आप PATH से पहले उस तरह के चर का उपयोग नहीं कर सकते।

(यह विंडोज 7 पर कम से कम लागू होता है। मैंने नए संस्करणों पर इसका परीक्षण नहीं किया है।)


0

शायद आप इसे गलत कर रहे हैं?

मैंने विंडोज एक्सपी प्रो एसपी 3 (32 बिट) के साथ प्रयास किया। मेरे पास %JAVA_HOME%(और %JAVAFX_HOME%, आदि) की कई घटनाओं के साथ एक रास्ता है । मैं कमांड लाइन पर जाता PATHहूं , टाइप करता हूं, मुझे वेरिएबल्स का विस्तार दिखाई देता है। अच्छा।

का मान बदल देता हूं JAVA_HOME। वापस उसी कमांड लाइन की खिड़की पर, PATHफिर से, उसी मूल्य ... जैसा कि अपेक्षित (अनुभव से!)।

मैं एक नई कमांड लाइन विंडो खोलता हूं, टाइप करें PATH, गोच, मैं नया मूल्य देखता हूं।

निश्चित नहीं है कि वहां सटीक तंत्र क्या है, लेकिन ऐसा लगता है कि cmd.exe सहित कोई भी चल रहा कार्यक्रम, शुरुआती समय में पर्यावरण चर के मूल्यों को पकड़ता है, और पीछे मुड़कर नहीं देखता है ... (हालांकि मेरा मानना ​​है कि एक अच्छा व्यवहार कार्यक्रम कर सकता है) env परिवर्तनों के लिए सुनो, हालांकि बहुत निश्चित नहीं है)।

इसे एक सुविधा या बग या झुंझलाहट के रूप में देखा जा सकता है, लेकिन यह काम करने का तरीका है। अरे, कम से कम, Win9X बार के विपरीत, हमें कंप्यूटर को रिबूट करने की आवश्यकता नहीं है! और NT बार (IIRC) के विपरीत, आपको लॉग आउट और बैक करने की आवश्यकता नहीं है।

असंगति क्यों? Microsoft के तरीके असंवेदनशील हैं: ...-P


यह बात नहीं है। परिवर्तन के बाद हम एक नए कमांड विंडो में परीक्षण कर रहे हैं। हम इस तथ्य से अवगत हैं कि सिस्टम मानों को बदलना प्रक्रियाओं को चलाने के लिए मूल्यों को नहीं बदलता है।
स्किप्पॉपी

ठीक है, इसलिए 'शायद' ... :-) और मेरी व्याख्या असंगतता को कवर नहीं करती है, लेकिन कुछ नौसिखियों के लिए उपयोगी हो सकती है ...: -पी ज्यादातर ज्यादातर यह बताना चाहता था कि मार्ग में हर जगह चर विस्तार काम करता है। .. कुछ सिस्टम के लिए! (उन सभी को मैंने इस्तेमाल किया ... हमेशा 32 बिट)।

0

मैंने सिस्टम> उन्नत सेटिंग्स> पर्यावरण चर में पर्यावरण चर सेट करने का संकल्प लिया है ।

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

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