सेटेक्स के साथ 1024 वर्ण सीमा को पार करना


72

मैं setxकमांड का उपयोग करके पर्यावरण चर सेट करने का प्रयास कर रहा हूं , जैसे कि निम्न प्रकार

setx PATH "f: \ common tools \ git \ bin; f: \ आम उपकरण \ python \ app; f: \ आम उपकरण \ python \ app \ script; f: \ आम उपकरण \ ruby ​​\ bin; f; \ masm32 \" बिन, एफ: \ बोर्लेन्ड \ BCC55 \ बिन;% पथ% "

हालाँकि, मुझे निम्न त्रुटि मिलती है यदि मान अधिक है तो 1024 वर्ण लंबा है:

चेतावनी: सहेजे जा रहे डेटा को 1024 वर्णों में विभाजित किया गया है।

सफलता: निर्दिष्ट मूल्य सहेजा गया था।

लेकिन अंत में कुछ पथ चर में सहेजे नहीं जाते हैं, मुझे लगता है कि चरित्र सीमा के कारण त्रुटि का सुझाव दिया गया है।


वहाँ वैकल्पिक तरीकों को संपादित करने की एक सूची है %PATH%पर superuser.com/questions/297947
Ehtesh चौधरी

1
में देखो रैपिड पर्यावरण संपादक आप (आप एक बैकअप भी बचा सकता है) रेखांकन सभी envirnoment चर संपादित करने देती है।
j7272

3
क्या कोई अन्य व्यक्ति इस दावे की सफलता से परेशान है जब यह स्पष्ट रूप से वह नहीं करता है जो अनुरोध किया गया था? क्या यह परेशान नहीं है कि यह रास्ता छोड़ते समय असफल नहीं होता है कि यह कैसे था?
चाड शाउगिन्स 16

क्या यह अभी भी विंडोज़ 10 पर छोटा है?
काउलिनेटर

1
हां, यह विंडोज 10 पर
इवान

जवाबों:


48

आपकी सबसे अच्छी शर्त सीधे रजिस्ट्री को संपादित करना है।

मान को नेविगेट HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentऔर संपादित करें Path(फिर नए मूल्य को सक्रिय करने के लिए रिबूट करें)।

ध्यान दें कि जब आप बहुत लंबा रास्ता दर्ज कर सकते हैं, (अधिकतम पर्यावरण चर लंबाई तक; 2,048 या 32,768 बाइट्स स्रोत पर निर्भर करता है), तो सभी सॉफ़्टवेयर बहुत लंबे समय तक सही ढंग से पढ़ने और इसे संभालने में सक्षम नहीं होंगे।


1
क्या वास्तव में यहां रिबूट की आवश्यकता है? सेटक्स इसे कैसे करता है? सेटेक्स को रिबूट की आवश्यकता नहीं है।
मधुर आहूजा

11
हां, एक रिबूट की आवश्यकता है। setxजैसा कि मैंने संकेत किया था, रजिस्ट्री को संपादित करता है, फिर एक WM_SETTINGCHANGEसंदेश प्रसारित करता है । यह सभी शीर्ष-स्तरीय विंडो बताता है कि एक सिस्टम सेटिंग बदल गई है (इस मामले में एक पर्यावरण चर)। इसके बिना, आपके द्वारा खोले गए एक्सप्लोरर और प्रोग्राम परिवर्तन के बारे में नहीं जान पाएंगे। आप स्वयं संदेश प्रसारित कर सकते हैं (मैंने ऐसा करने के लिए एक कार्यक्रम लिखा था, और एक बैच फ़ाइल को प्रतिस्थापित करने के लिए SETXजो एक रजिस्ट्री को प्रसारण के बाद संपादित करता है), लेकिन बस setxऔर सिस्टम गुण envvar संवाद की तरह, इसके दुष्प्रभाव हैं जो रिबूटिंग को प्राथमिकता दें।
19

2
ओह और संपादन एक। यदि आप रिबूट नहीं करते हैं तो वास्तव में समस्याएँ पैदा होती हैं क्योंकि अन्य चर वाले किसी भी पर्यावरण चर का विस्तार होना बंद हो जाएगा। उदाहरण के लिए, मैंने अभी इसे प्रसारित किया है और अब यह मेरा मार्ग है और मुझे एक त्रुटि मिलती है क्योंकि मार्ग अब "टूट गया" / खाली है। जब तक मैं रिबूट नहीं करता हूं, तब तक कोई भी संस्करण ठीक से विस्तार नहीं करेगा। दुर्भाग्य से यह "सामान्य" है। :-|
Synetech

3
मुझे एक छोटी सी PowerShell स्क्रिप्ट मिली जो WM_SETTINGCHANGE संदेश को प्रसारित करेगी।
जस्टिन डियरिंग

10
आप REG ऐड कमांड के माध्यम से उपरोक्त रजिस्ट्री पद्धति का उपयोग कर सकते हैं और फिर SETX का उपयोग करके अपने लिए कुछ अन्य चर सेट कर सकते हैं (जैसे: SETX / M USERNAME% USERNAME%)। यह WM_SETTINGCHANGE संदेश को सेट करने का कारण होगा और आपको बैच फ़ाइल से पथ सेट करने की क्षमता देगा।
आर्ट

28

यदि आप विस्टा या उच्चतर विंडो का उपयोग कर रहे हैं, तो आप symbolic linkफ़ोल्डर में एक बना सकते हैं । उदाहरण के लिए:

mklink /d C:\pf "C:\Program Files"
mklink /d C:\pf86 "C:\Program Files (x86)"

एक लिंक बनाना होगा ताकि c:\pfआपका प्रोग्राम फाइल फोल्डर बन जाए। मैंने इस ट्रिक का उपयोग करके अपने पथ से 300 वर्णों को काट दिया।

(मुझे पता है कि यह सेटक्स से संबंधित नहीं है, लेकिन यह उन लोगों के लिए उपयोगी है, जो 1024 char की सीमा पर खोज कर रहे हैं)


18

आप निम्न के समान PowerShell स्क्रिप्ट का उपयोग कर सकते हैं:

$newPath = 'f:\common tools\git\bin;f:\common tools\python\app;f:\common tools\python\app\scripts;f:\common tools\ruby\bin;f:\masm32\bin;F:\Borland\BCC55\Bin'
$oldPath = [Environment]::GetEnvironmentVariable('path', 'machine');
[Environment]::SetEnvironmentVariable('path2', "$($newPath);$($oldPath)",'Machine');

Environment.SetEnvironmentVariable () API कॉल का प्रसारण किया जाएगा WM_SETTINGCHANGEताकि आप रिबूट की जरूरत नहीं है।


क्या आपको निम्न पंक्ति की भी आवश्यकता नहीं है: [पर्यावरण] :: SetEnvironmentVariable ('पथ', "$ newPath", 'मशीन');
फेडर स्टीमन

1
तीसरी पंक्ति में, मुझे यकीन नहीं है कि अतिरिक्त डॉलर के संकेत और कोष्ठक लाने से क्या लाभ होगा। क्या आप अभी नहीं कह सकते [Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine')?
ट्वासब्रिलिग

1
जब मैं एक स्ट्रिंग में एक वैरिएबल शामिल कर रहा हूं, तो @twasbrillig मैं बस सावधान हूं। इस मामले में इसकी आवश्यकता नहीं है।
जस्टिन डियरिंग

3
आप इसे प्रशासक कमांड प्रॉम्प्ट से कह सकते हैं:@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -Command "[Environment]::SetEnvironmentVariable('path',\"C:\Program Files (x86)\GNU\GnuPG;$([Environment]::GetEnvironmentVariable('path','Machine'))\",'Machine');"
मार्क सी

7

यह ओपन-सोर्स SetEnv कमांड-लाइन टूल PATH और अन्य पर्यावरण चर को सीमाओं के बिना संपादित करने के लिए अच्छा है। यह एक गतिशील बफर का उपयोग करता है इसलिए 1024 जैसी कोई स्थिर सीमा नहीं है।

http://www.codeproject.com/Articles/12153/SetEnv

एक चर के लिए अपील करने के लिए एक उपसर्ग के रूप में एक% की पसंद हालांकि बेहतर हो सकती थी, जैसा कि वाक्यविन्यास को कभी-कभी कठिन बना देता है यदि अन्य बैच स्थानीय चर के साथ उपयोग किया जाता है ...


> SetEnv टूल PATH और अन्य पर्यावरण चर को सीमा के बिना संपादित करने के लिए अच्छा है । वास्तव में, मैंने व्यक्तिगत रूप से उस पेज पर डार्कए के साथ काम किया था ताकि सेटएवन को और भी बेहतर बनाने में मदद मिल सके ताकि यह विस्तार / उप-चर (डायनामिक वेरिएबल एक्सपेंशन सेक्शन) का पूरी तरह से समर्थन कर सके, जो वास्तव में कच्चे रास्ते की लंबाई को कम करने में मदद करता है ।
सिंटेक

4

पथ हेरफेर के लिए setx से एक बेहतर उपकरण pathed.exe है । दुर्भाग्य से, यह पथ को संपादित करने तक सीमित है।

सेटक्स की तुलना में एक बेहतर उपयोगकर्ता अनुभव के अलावा, आपके पास 1024 वर्ण सीमा नहीं है। प्रत्यक्ष रजिस्ट्री हेरफेर के विपरीत, यह एप्लिकेशन एनवायरनमेंट का उपयोग करता है। SetEnvironmentVariable () एपीआई कॉल जो प्रसारित करेगा WM_SETTINGCHANGE


2
Superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7 पर अन्य टूल (लिस्टेड सहित) की एक सूची है
एहतेश चौधरी


2

मेरा पसंदीदा तरीका है कि 8.3 नामों का उपयोग करने के लिए PATH चर में फ़ोल्डर के नाम बदलें। इस स्टैकऑवरफ़्लो उत्तर में एक भयानक स्क्रिप्ट (एक .bat फ़ाइल से रन) है जो पूरे पैट चर के "कीमा बनाया हुआ" संस्करण को उत्पन्न करेगा, जिसे आप बाद में संपादित चर संवाद (ओं) में पेस्ट कर सकते हैं। केवल चेतावनी यह है कि आपको सिस्टम और USER भागों को विभाजित करना होगा। चूंकि स्क्रिप्ट प्रत्येक फ़ोल्डर के लिए लघु संस्करण से होकर गुजरती है, यह आपको किसी भी अमान्य / गैर-मौजूद पथ के बारे में बताती और सचेत करती है। नाइस लिटिल क्लीन अप बोनस।


यदि आपने उपयोग किया है तो सावधान रहें fsutil.exe behavior set disable8dot3 1
एंड्रयू मॉर्टन 19

@AndrewMorton अच्छी बात है, लेकिन यह इस तथ्य से "नियंत्रित" नहीं किया जाएगा कि स्क्रिप्ट 8.3 नाम नहीं उत्पन्न करती है, यह सिर्फ 8.3 नाम बताती है जिसे फ़ाइल सिस्टम ने सौंपा है? इसलिए यदि किसी फ़ोल्डर में 8.3 नाम नहीं है, तो स्क्रिप्ट विकल्प का प्रस्ताव नहीं करेगी। हालाँकि, fsutil 8dot3name stripस्क्रिप्ट का उपयोग करके AFTER का उपयोग करने से निश्चित रूप से प्रभावित फ़ोल्डरों के लिए समस्याएँ पैदा होंगी।
एंड्रयू स्टीट्ज

दुर्भाग्य से मेरे पास इसकी जांच करने के लिए कोई अतिरिक्त ड्राइव या सिस्टम नहीं है। हालाँकि, fsutil 8dot3name stripआज कुछ पहले इस्तेमाल किया है और यह देखते हुए कि (ए) यह पहले रजिस्ट्री की जाँच करता है और (बी) पथ रजिस्ट्री में संग्रहीत किया जाता है, मेरी पहले की चिंता अनुचित हो सकती है, जब तक कि उपयोगकर्ता /f(बल) विकल्प का उपयोग नहीं करता है ।
एंड्रयू मॉर्टन

2

आप इस लाइन को अपने BAT में डाल सकते हैं:

setx path "%%path%%;c:\drive\fr;c:\drive\installs\7z"

डबल देखें %%

(संदर्भ: https://support.microsoft.com/en-us/kb/75634 )


लिंक अब टूट गया है
इवान

1
चेतावनी! यह संभवतः चीजों को तोड़ देगा, यह %path%;c:\...[snip]...\7zउपयोगकर्ता pathचर को लिख देगा, जो आपके पास वहां था और कुछ भी छोड़ देना।
यूजीन पेट्रोव

कार्यक्रमों द्वारा उपयोग किया जाने वाला PATH पर्यावरण चर मशीन और स्थानीय PATH चर का संयोजन है। स्थानीय पथ में वर्तमान डेटा को नष्ट करने के अलावा मुझे नहीं लगता कि यह कुछ भी करता है। बीत रहा है %path%स्थानीय पथ वातावरण चर में कोई प्रभाव नहीं होना चाहिए।
अन्नान

0

यदि सिस्टम PATH और उपयोगकर्ता PATH को अलग रखना आवश्यक नहीं है:

::setx /m truncate variable length to 1024 REG ADD 
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH /t REG_SZ /f /d "%PATH%"
::empty local path, use system wide only, else it will enlarge with every setx /m
setx PATH ""
::setx is dummy but propagate system wide variables with it
setx /m A A

1
क्या आप यहां जो सुझाव दे रहे हैं, उसके बारे में थोड़ा और बता सकते हैं?
जी-मैन

यह केवल कमांड सेट का उपयोग करने के लिए तैयार है। उदाहरण सीधे पेट चर पर दिखाया गया है। यद्यपि पिछले उत्तर मददगार हैं लेकिन उनमें अंतिम समाधान का अभाव है।
फंतासी

0

मुझे लगता है कि सबसे अच्छा तरीका अगला (पावरशेल के साथ) है इस तरह से आप 1024 चरित्र के लिटमिट से भी बचते हैं।

आप इस कोड को देख सकते हैं: https://gist.github.com/drazul/b92f780689bd89a0d2a7

#------------ Add path to system variable -------------------------------------

$path2add = ';C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

If (!$systemPath.contains($path2add)) {
    $systemPath += $path2add
    $systemPath = $systemPath -join ';'
    [Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');
    write-host "Added to path!"
    write-host $systemPath
}

#------------ Delete path from system variable --------------------------------

$path2delete = 'C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

$systemPath = $systemPath.replace($path2delete, '')
$systemPath = $systemPath -join ';'

[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');

write-host "Deleted from path!"
write-host $systemPath

#------------ Clean system variable -------------------------------------------

$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

while ($systemPath.contains(';;')) {
    $systemPath = $systemPath.replace(';;', ';')
}

[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');

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